2022-08-24 17:05:40 +03:00
|
|
|
import database from '../utils/database/index.js';
|
2022-03-05 22:57:23 +04:00
|
|
|
|
|
|
|
const db = database['pagesOrder'];
|
2019-01-19 17:09:11 +03:00
|
|
|
|
|
|
|
/**
|
2020-05-09 05:38:25 +03:00
|
|
|
* @typedef {object} PageOrderData
|
2019-01-19 17:09:11 +03:00
|
|
|
* @property {string} _id - row unique id
|
|
|
|
* @property {string} page - page id
|
|
|
|
* @property {Array<string>} order - list of ordered pages
|
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
export interface PageOrderData {
|
|
|
|
_id?: string;
|
|
|
|
page?: string;
|
|
|
|
order?: string[];
|
|
|
|
}
|
2019-01-19 17:09:11 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @class PageOrder
|
|
|
|
* @classdesc PageOrder
|
|
|
|
*
|
|
|
|
* Creates order for Pages with children
|
|
|
|
*/
|
|
|
|
class PageOrder {
|
2022-03-05 22:57:23 +04:00
|
|
|
public _id?: string;
|
|
|
|
public page?: string;
|
|
|
|
private _order?: string[];
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @class
|
|
|
|
*
|
|
|
|
* @param {PageOrderData} data - info about pageOrder
|
|
|
|
*/
|
|
|
|
constructor(data: PageOrderData = {}) {
|
|
|
|
if (data === null) {
|
|
|
|
data = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data._id) {
|
|
|
|
this._id = data._id;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.data = data;
|
|
|
|
}
|
|
|
|
|
2019-01-19 17:09:11 +03:00
|
|
|
/**
|
|
|
|
* Returns current Page's children order
|
|
|
|
*
|
|
|
|
* @param {string} pageId - page's id
|
2022-03-05 22:57:23 +04:00
|
|
|
* @returns {Promise<PageOrder>}
|
2019-01-19 17:09:11 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public static async get(pageId: string): Promise<PageOrder> {
|
2019-02-15 17:56:56 +03:00
|
|
|
const order = await db.findOne({ page: pageId });
|
2019-01-19 17:09:11 +03:00
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
let data: PageOrderData = {};
|
2019-01-19 17:09:11 +03:00
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
if (order === null) {
|
2019-01-19 17:09:11 +03:00
|
|
|
data.page = pageId;
|
|
|
|
} else {
|
|
|
|
data = order;
|
|
|
|
}
|
|
|
|
|
|
|
|
return new PageOrder(data);
|
|
|
|
}
|
|
|
|
|
2019-02-19 17:29:45 +03:00
|
|
|
/**
|
|
|
|
* Find all pages which match passed query object
|
|
|
|
*
|
2022-03-05 22:57:23 +04:00
|
|
|
* @param {object} query - input query
|
|
|
|
* @returns {Promise<PageOrder[]>}
|
2019-02-19 17:29:45 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public static async getAll(query: Record<string, unknown> = {}): Promise<PageOrder[]> {
|
2019-02-19 17:29:45 +03:00
|
|
|
const docs = await db.find(query);
|
|
|
|
|
|
|
|
return Promise.all(docs.map(doc => new PageOrder(doc)));
|
|
|
|
}
|
|
|
|
|
2022-06-22 07:09:08 -07:00
|
|
|
/**
|
|
|
|
* Returns only root page's order
|
|
|
|
*
|
|
|
|
* @returns {Promise<PageOrder[]>}
|
|
|
|
*/
|
|
|
|
public static async getRootPageOrder(): Promise<PageOrder> {
|
|
|
|
const docs = await db.findOne({ 'page': '0' });
|
|
|
|
|
|
|
|
return new PageOrder(docs);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns only child page's order
|
|
|
|
*
|
|
|
|
* @returns {Promise<PageOrder[]>}
|
|
|
|
*/
|
|
|
|
public static async getChildPageOrder(): Promise<PageOrder[]> {
|
|
|
|
const docs = await this.getAll({ 'page': { $ne: '0' } });
|
|
|
|
|
|
|
|
return Promise.all(docs.map(doc => new PageOrder(doc)));
|
|
|
|
}
|
|
|
|
|
2019-01-19 17:09:11 +03:00
|
|
|
/**
|
|
|
|
* constructor data setter
|
2020-05-09 05:38:25 +03:00
|
|
|
*
|
2022-03-05 22:57:23 +04:00
|
|
|
* @param {PageOrderData} pageOrderData - info about pageOrder
|
2019-01-19 17:09:11 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public set data(pageOrderData: PageOrderData) {
|
|
|
|
this.page = pageOrderData.page || '0';
|
|
|
|
this.order = pageOrderData.order || [];
|
2019-01-19 17:09:11 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return Page Children order
|
2020-05-09 05:38:25 +03:00
|
|
|
*
|
2019-01-19 17:09:11 +03:00
|
|
|
* @returns {PageOrderData}
|
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public get data(): PageOrderData {
|
2019-01-19 17:09:11 +03:00
|
|
|
return {
|
|
|
|
_id: this._id,
|
2022-03-05 22:57:23 +04:00
|
|
|
page: '' + this.page,
|
|
|
|
order: this.order,
|
2019-01-19 17:09:11 +03:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pushes page id to the orders array
|
|
|
|
*
|
|
|
|
* @param {string} pageId - page's id
|
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public push(pageId: string | number): void {
|
2019-01-19 17:09:11 +03:00
|
|
|
if (typeof pageId === 'string') {
|
2022-03-05 22:57:23 +04:00
|
|
|
if (this.order === undefined) {
|
|
|
|
this.order = [];
|
|
|
|
}
|
|
|
|
this.order.push(pageId);
|
2019-01-19 17:09:11 +03:00
|
|
|
} else {
|
|
|
|
throw new Error('given id is not string');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes page id from orders array
|
|
|
|
*
|
|
|
|
* @param {string} pageId - page's id
|
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public remove(pageId: string): void {
|
|
|
|
if (this.order === undefined) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const found = this.order.indexOf(pageId);
|
2019-01-19 17:09:11 +03:00
|
|
|
|
|
|
|
if (found >= 0) {
|
2022-03-05 22:57:23 +04:00
|
|
|
this.order.splice(found, 1);
|
2019-01-19 17:09:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {string} currentPageId - page's id that changes the order
|
|
|
|
* @param {string} putAbovePageId - page's id above which we put the target page
|
|
|
|
*
|
2022-03-05 22:57:23 +04:00
|
|
|
* @returns {void}
|
2019-01-19 17:09:11 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public putAbove(currentPageId: string, putAbovePageId: string): void {
|
|
|
|
if (this.order === undefined) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-01-19 17:09:11 +03:00
|
|
|
const found1 = this.order.indexOf(putAbovePageId);
|
|
|
|
const found2 = this.order.indexOf(currentPageId);
|
|
|
|
|
|
|
|
if (found1 === -1 || found2 === -1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const margin = found1 < found2 ? 1 : 0;
|
|
|
|
|
|
|
|
this.order.splice(found1, 0, currentPageId);
|
|
|
|
this.order.splice(found2 + margin, 1);
|
|
|
|
}
|
|
|
|
|
2019-01-25 06:19:37 +03:00
|
|
|
/**
|
|
|
|
* Returns page before passed page with id
|
|
|
|
*
|
2022-03-05 22:57:23 +04:00
|
|
|
* @param {string} pageId - identity of page
|
2019-01-25 06:19:37 +03:00
|
|
|
*/
|
Added page navigation (#209)
* Added navigation on page
* Removed useless log, added docs to navigator component
* Fixed duplicated variables, some changes in navigation functions, changed pages.twig and navigator.twig
* Added flatArray model, changed navigation functions
* Replaced page footer style to page.pcss
* Fixed generating flat array, when pages remove
* Removed useless generating
* Renamed flatArray model to pagesFlatArray, updated descriptions, renamed generate to regenerate, removed hardcoded key name in cache
* Changed styles naming and added margin for navigation
* Added ability to change nesting in flat array, fixed BEM
* Updated nesting parameter, fixed BEM
* Changed navigator component by passing objects, removed navigator wrapper
* Style navigator renamed to navigator__item
* Update src/backend/models/pagesFlatArray.ts
Co-authored-by: Peter Savchenko <specc.dev@gmail.com>
* Renamed navigator__item to navigator_item
* Deleted wrappers from navigator buttons, removed page__footer
Co-authored-by: Peter Savchenko <specc.dev@gmail.com>
2022-08-02 17:38:02 +03:00
|
|
|
public getSubPageBefore(pageId: string): string | null {
|
2022-03-05 22:57:23 +04:00
|
|
|
if (this.order === undefined) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2019-01-25 06:19:37 +03:00
|
|
|
const currentPageInOrder = this.order.indexOf(pageId);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If page not found or first return nothing
|
|
|
|
*/
|
|
|
|
if (currentPageInOrder <= 0) {
|
2022-03-05 22:57:23 +04:00
|
|
|
return null;
|
2019-01-25 06:19:37 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return this.order[currentPageInOrder - 1];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns page before passed page with id
|
|
|
|
*
|
2022-03-05 22:57:23 +04:00
|
|
|
* @param pageId - identity of page
|
2019-01-25 06:19:37 +03:00
|
|
|
*/
|
Added page navigation (#209)
* Added navigation on page
* Removed useless log, added docs to navigator component
* Fixed duplicated variables, some changes in navigation functions, changed pages.twig and navigator.twig
* Added flatArray model, changed navigation functions
* Replaced page footer style to page.pcss
* Fixed generating flat array, when pages remove
* Removed useless generating
* Renamed flatArray model to pagesFlatArray, updated descriptions, renamed generate to regenerate, removed hardcoded key name in cache
* Changed styles naming and added margin for navigation
* Added ability to change nesting in flat array, fixed BEM
* Updated nesting parameter, fixed BEM
* Changed navigator component by passing objects, removed navigator wrapper
* Style navigator renamed to navigator__item
* Update src/backend/models/pagesFlatArray.ts
Co-authored-by: Peter Savchenko <specc.dev@gmail.com>
* Renamed navigator__item to navigator_item
* Deleted wrappers from navigator buttons, removed page__footer
Co-authored-by: Peter Savchenko <specc.dev@gmail.com>
2022-08-02 17:38:02 +03:00
|
|
|
public getSubPageAfter(pageId: string): string | null {
|
2022-03-05 22:57:23 +04:00
|
|
|
if (this.order === undefined) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2019-01-25 06:19:37 +03:00
|
|
|
const currentPageInOrder = this.order.indexOf(pageId);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If page not found or is last
|
|
|
|
*/
|
|
|
|
if (currentPageInOrder === -1 || currentPageInOrder === this.order.length - 1) {
|
2022-03-05 22:57:23 +04:00
|
|
|
return null;
|
2019-01-25 06:19:37 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return this.order[currentPageInOrder + 1];
|
|
|
|
}
|
|
|
|
|
2019-02-19 17:29:45 +03:00
|
|
|
/**
|
|
|
|
* @param {string[]} order - define new order
|
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public set order(order: string[]) {
|
2019-02-19 17:29:45 +03:00
|
|
|
this._order = order;
|
|
|
|
}
|
|
|
|
|
2019-01-19 17:09:11 +03:00
|
|
|
/**
|
|
|
|
* Returns ordered list
|
|
|
|
*
|
2020-05-09 05:38:25 +03:00
|
|
|
* @returns {string[]}
|
2019-01-19 17:09:11 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public get order(): string[] {
|
|
|
|
return this._order || [];
|
2019-01-19 17:09:11 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Save or update page data in the database
|
2022-03-05 22:57:23 +04:00
|
|
|
*
|
|
|
|
* @returns {Promise<PageOrder>}
|
2019-01-19 17:09:11 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public async save(): Promise<PageOrder> {
|
2019-01-19 17:09:11 +03:00
|
|
|
if (!this._id) {
|
2022-03-05 22:57:23 +04:00
|
|
|
const insertedRow = await db.insert(this.data) as { _id: string};
|
2019-01-19 17:09:11 +03:00
|
|
|
|
|
|
|
this._id = insertedRow._id;
|
|
|
|
} else {
|
2019-02-15 17:56:56 +03:00
|
|
|
await db.update({ _id: this._id }, this.data);
|
2019-01-19 17:09:11 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove page data from the database
|
2022-03-05 22:57:23 +04:00
|
|
|
*
|
|
|
|
* @returns {Promise<void>}
|
2019-01-19 17:09:11 +03:00
|
|
|
*/
|
2022-03-05 22:57:23 +04:00
|
|
|
public async destroy(): Promise<void> {
|
2019-02-15 17:56:56 +03:00
|
|
|
await db.remove({ _id: this._id });
|
2019-01-19 17:09:11 +03:00
|
|
|
|
|
|
|
delete this._id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
export default PageOrder;
|