@kohanajs/mod-cms
Advanced tools
Comparing version 3.2.0 to 4.0.0
@@ -5,2 +5,11 @@ # Changelog | ||
## [4.0.0](https://gitlab.com/kohana-js/proposals/level0/mod-cms/compare/v3.2.0...v4.0.0) (2021-11-08) | ||
### ⚠ BREAKING CHANGES | ||
* remove not necessary classes, define page type in config file | ||
* remove not necessary classes, define page type in config file ([7c15a3f](https://gitlab.com/kohana-js/proposals/level0/mod-cms/commit/7c15a3ffc4b3abc5e39b51e069fc8e53fcdc7d5e)) | ||
## [3.2.0](https://gitlab.com/kohana-js/proposals/level0/mod-cms/compare/v3.1.0...v3.2.0) (2021-11-04) | ||
@@ -7,0 +16,0 @@ |
@@ -6,5 +6,2 @@ const {SQL} = require("@kohanajs/constants"); | ||
const Page = ORM.require('Page'); | ||
const PageType = ORM.require('PageType'); | ||
const PageValue = ORM.require('PageValue'); | ||
const PageAttribute = ORM.require('PageAttribute'); | ||
const PageItem = ORM.require('PageItem'); | ||
@@ -14,2 +11,4 @@ const PageItemValue = ORM.require('PageItemValue'); | ||
const HelperPage = require('../../helper/Page'); | ||
class ControllerAdminContent extends ControllerAdmin{ | ||
@@ -36,59 +35,8 @@ constructor(request, options = {}){ | ||
static arrayToObject(values, languageId= 1){ | ||
const result = {}; | ||
values.forEach(it => { | ||
if(it.language_id && it.language_id !== languageId)return; | ||
if(it.attribute_name){ | ||
result[it.name] = result[it.name] || {}; | ||
result[it.name][it.attribute_name] = it; | ||
return; | ||
} | ||
result[it.name] = it; | ||
}) | ||
return result | ||
} | ||
static itemsToObject(items, languageId=1){ | ||
const result = {} | ||
items.forEach(x => { | ||
result[x.name] = result[x.name] || []; | ||
const obj = { _ : x }; | ||
x.page_item_values.forEach(y => { | ||
if(y.language_id && y.language_id !== languageId)return; | ||
if(y.attribute_name){ | ||
obj[y.name] = obj[y.name] || {}; | ||
obj[y.name][y.attribute_name] = y; | ||
return; | ||
} | ||
obj[y.name] = y; | ||
}) | ||
result[x.name].push(obj); | ||
}); | ||
//sort items by weight; | ||
Object.keys(result).forEach(key => { | ||
result[key] = result[key].sort((a, b) => (a._.weight || 0) - (b._.weight || 0)); | ||
}) | ||
return result; | ||
} | ||
static blocksToObject(blocks){ | ||
//TODO, block | ||
return {}; | ||
} | ||
async assignDatabase(){ | ||
const draftDB = this.state.get(ControllerMixinDatabase.DATABASES).get('draft'); | ||
const database = this.state.get(ControllerMixinDatabase.DATABASES).get('pagetype'); | ||
const page_type = this.request.params['page_type']; | ||
const pageType = await ORM.readWith(PageType, [['','name', SQL.LIKE, page_type]], {database}); | ||
return { | ||
draftDB, page_type, pageType | ||
draftDB, page_type | ||
} | ||
@@ -98,15 +46,13 @@ } | ||
async action_index(){ | ||
const { draftDB, page_type, pageType } = await this.assignDatabase(); | ||
const { draftDB, page_type } = await this.assignDatabase(); | ||
if(!pageType)throw new Error(`page type ${page_type} not found`); | ||
const instances = this.state.get('instances'); | ||
await ORM.eagerLoad(instances, {with: ['PageAttribute', 'PageValue']}, draftDB); | ||
await ORM.eagerLoad(instances, {with: ['PageAttribute', 'PageValue']}, {database: draftDB}); | ||
instances.forEach(it => { | ||
it.attributes = ControllerAdminContent.arrayToObject(it.page_attributes || []); | ||
it.values = ControllerAdminContent.arrayToObject(it.page_values || []); | ||
it.attributes = HelperPage.arrayToObject(it.page_attributes || []); | ||
it.values = HelperPage.arrayToObject(it.page_values || []); | ||
}); | ||
const items = instances.filter(it => it.page_type_id === pageType.id); | ||
const items = instances.filter(it => it.page_type === page_type); | ||
@@ -125,8 +71,8 @@ this.state.get(ControllerMixinView.LAYOUT).data.scripts = ['table-dd.js']; | ||
async action_create_by_type(){ | ||
const { draftDB, page_type, pageType } = await this.assignDatabase(); | ||
const { draftDB, page_type } = await this.assignDatabase(); | ||
const insertID = ORMAdapter.defaultID(); | ||
const page = ORM.create(Page, {database: draftDB, insertID}); | ||
page.name = `Untitled ${pluralize.singular(pageType.name)}`; | ||
page.page_type_id = pageType.id; | ||
page.name = `Untitled ${pluralize.singular(page_type)}`; | ||
page.page_type = page_type; | ||
page.slug = String(insertID); | ||
@@ -188,146 +134,4 @@ await page.write(); | ||
} | ||
static async create(mapName, model, name, attribute_name, instance, languageId, database){ | ||
const item = ORM.create(model, {database}); | ||
item.name = name; | ||
if(attribute_name)item.attribute_name = attribute_name; | ||
if(languageId)item.language_id = languageId; | ||
item.page_id = instance.id; | ||
item.value = ""; | ||
await item.write(); | ||
return item; | ||
} | ||
static async createEmptyValue(name, attribute_name, instance, languageId, database){ | ||
await this.create('pageValueMap', PageValue, name, attribute_name, instance, languageId, database); | ||
} | ||
static async createEmptyAttribute(name, attribute_name, instance, database){ | ||
await this.create('pageAttributeMap', PageAttribute, name, attribute_name, instance, null, database); | ||
} | ||
static async createEmptyItemValue(item_name, value_name, subvalue, instance, languageId, database, index=0){ | ||
const item = ORM.create(PageItemValue, {database}); | ||
item.name = value_name; | ||
if(subvalue)item.attribute_name = subvalue; | ||
if(languageId)item.language_id = languageId; | ||
item.page_item_id = instance.items[item_name][index]._.id; | ||
item.value = ""; | ||
await item.write(); | ||
return item; | ||
} | ||
/** | ||
* | ||
* @param {Page} instance | ||
* @param {string} pageType | ||
* @param database | ||
* @param {number} languageId | ||
* @returns {Promise<void>} | ||
*/ | ||
static async defaultValue(instance, pageType, database, languageId = 1){ | ||
const blueprint = KohanaJS.config.cms.blueprint || {}; | ||
const content = blueprint[pageType.toLowerCase()]; | ||
if(!content)throw new Error(`Creating undefined content by page type : ${pageType}`); | ||
//prepare instance to check default value exists | ||
if(!instance.page_values || !instance.page_attributes || !instance.page_items ){ | ||
await instance.eagerLoad({ | ||
with: ['PageValue', 'PageAttribute', 'PageItem'], | ||
page_items: { | ||
with: ['PageItemValue'] | ||
} | ||
}); | ||
} | ||
if(!instance.values || !instance.attributes || !instance.items ){ | ||
instance.values = this.arrayToObject(instance.page_values, languageId); | ||
instance.attributes = this.arrayToObject(instance.page_attributes, languageId); | ||
instance.items = this.itemsToObject(instance.page_items, languageId); | ||
} | ||
await Promise.all( | ||
content.attributes.map(async it => { | ||
//it is from config file | ||
if(typeof it === "string") { | ||
if(instance.attributes[it])return; | ||
return await this.createEmptyAttribute(it, null, instance, database); | ||
} | ||
const name = Object.keys(it)[0]; | ||
const subvalues = it[name]; | ||
await Promise.all( | ||
subvalues.map(async attr => { | ||
if(instance.attributes[name] && instance.attributes[name][attr])return; | ||
await this.createEmptyAttribute(name, attr, instance, database) | ||
}) | ||
); | ||
}) | ||
) | ||
await Promise.all( | ||
content.values.map(async it => { | ||
if(typeof it === "string") { | ||
if(instance.values[it]) return; | ||
return await this.createEmptyValue(it, null, instance, languageId, database); | ||
} | ||
const name = Object.keys(it)[0]; | ||
const subvalues = it[name]; | ||
await Promise.all( | ||
subvalues.map(async attr => { | ||
if(instance.values[name] && instance.values[name][attr])return; | ||
await this.createEmptyValue(name, attr, instance, languageId, database) | ||
}) | ||
); | ||
}) | ||
); | ||
await Promise.all( | ||
Object.keys(content.items).map(async item_name => { | ||
if(!instance.items[item_name]){ | ||
instance.items[item_name] = []; | ||
const item = instance.items[item_name]; | ||
const firstItem = await ORM.readWith(PageItem, [['', 'page_id', SQL.EQUAL, instance.id], [SQL.AND, 'name', SQL.EQUAL, item_name], [SQL.AND, 'weight', SQL.EQUAL, 1]], {database}); | ||
if(!firstItem){ | ||
const firstItem = ORM.create(PageItem, {database}); | ||
firstItem.page_id = instance.id; | ||
firstItem.name = item_name; | ||
firstItem.weight = 1; | ||
await firstItem.write(); | ||
item[0] = {_: firstItem}; | ||
} | ||
} | ||
await Promise.all( | ||
content.items[item_name].map(async value => { | ||
if(typeof value === "string") { | ||
if(instance.items[item_name] && instance.items[item_name][0][value])return; | ||
return await this.createEmptyItemValue(item_name, value, null, instance, languageId, database); | ||
} | ||
const valueName = Object.keys(value)[0]; | ||
await Promise.all( | ||
value[valueName].map(async subvalue => { | ||
//guard item value with attribute exist | ||
if( | ||
instance.items[item_name][0] && | ||
instance.items[item_name][0][valueName] && | ||
instance.items[item_name][0][valueName][subvalue] | ||
)return; | ||
await this.createEmptyItemValue(item_name, valueName, subvalue, instance, languageId, database) | ||
}) | ||
); | ||
}) | ||
) | ||
}) | ||
); | ||
} | ||
} | ||
module.exports = ControllerAdminContent; |
@@ -7,6 +7,5 @@ const path = require('path'); | ||
const { ControllerMixinMultipartForm } = require('@kohanajs/mod-form'); | ||
const ControllerAdminContent = KohanaJS.require('controller/admin/Content'); | ||
const HelperPage = require('../../helper/Page'); | ||
const Page = ORM.require('Page'); | ||
const PageType = ORM.require('PageType'); | ||
const Language = ORM.require('Language'); | ||
@@ -19,3 +18,2 @@ | ||
databases: new Map([ | ||
['pagetype', `${KohanaJS.config.cms.databasePath}/pagetype.sqlite`], | ||
['draft', `${KohanaJS.config.cms.databasePath}/content.sqlite`], | ||
@@ -67,7 +65,5 @@ ['live', `${KohanaJS.config.cms.databasePath}/www/content.sqlite`], | ||
const database = this.state.get(ControllerMixinDatabase.DATABASES).get('draft'); | ||
const pageTypeDB = this.state.get(ControllerMixinDatabase.DATABASES).get('pagetype'); | ||
//find page type name | ||
const pageType = await ORM.factory(PageType, instance.page_type_id, {database: pageTypeDB}) | ||
await ControllerAdminContent.defaultValue(instance, pageType.name, database, this.languageId); | ||
await HelperPage.defaultValue(instance, instance.page_type, database, this.languageId); | ||
@@ -195,11 +191,9 @@ const $_POST = this.state.get(ControllerMixinMultipartForm.POST_DATA); | ||
templateData.values = ControllerAdminContent.arrayToObject(page.page_values, this.languageId); | ||
templateData.attributes = ControllerAdminContent.arrayToObject(page.page_attributes, this.languageId); | ||
templateData.items = ControllerAdminContent.itemsToObject(page.page_items, this.languageId); | ||
templateData.blocks = ControllerAdminContent.blocksToObject(page.blocks, this.languageId); | ||
templateData.values = HelperPage.arrayToObject(page.page_values, this.languageId); | ||
templateData.attributes = HelperPage.arrayToObject(page.page_attributes, this.languageId); | ||
templateData.items = HelperPage.itemsToObject(page.page_items, this.languageId); | ||
templateData.blocks = HelperPage.blocksToObject(page.blocks, this.languageId); | ||
templateData.language = this.language; | ||
const database = this.state.get(ControllerMixinDatabase.DATABASES).get('pagetype'); | ||
const pageType = await ORM.factory(PageType, page.page_type_id, {database}) | ||
const editTemplateFolder = pageType.name ?? 'default'; | ||
const editTemplateFolder = page.page_type ?? 'default'; | ||
this.setTemplate(`templates/admin/page/page_types/${editTemplateFolder.toLowerCase()}/edit`, templateData); | ||
@@ -213,7 +207,3 @@ } | ||
if(this.language === KohanaJS.config.cms.defaultLanguage){ | ||
const pageType = await ORM.factory(PageType, page.page_type_id, { | ||
database: this.state.get(ControllerMixinDatabase.DATABASES).get('pagetype') | ||
}) | ||
await ControllerAdminContent.defaultValue(page, pageType.name, database, this.languageId); | ||
await HelperPage.defaultValue(page, page.page_type, database, this.languageId); | ||
return; | ||
@@ -230,5 +220,5 @@ } | ||
const masterPageObject = { | ||
values : ControllerAdminContent.arrayToObject(page.page_values, masterLanguage.id), | ||
items: ControllerAdminContent.itemsToObject(page.page_items, masterLanguage.id), | ||
blocks: ControllerAdminContent.blocksToObject(page.blocks, masterLanguage.id), | ||
values : HelperPage.arrayToObject(page.page_values, masterLanguage.id), | ||
items: HelperPage.itemsToObject(page.page_items, masterLanguage.id), | ||
blocks: HelperPage.blocksToObject(page.blocks, masterLanguage.id), | ||
} | ||
@@ -240,5 +230,5 @@ | ||
const pageObject = { | ||
values : ControllerAdminContent.arrayToObject(page.page_values, this.languageId), | ||
items: ControllerAdminContent.itemsToObject(page.page_items, this.languageId), | ||
blocks: ControllerAdminContent.blocksToObject(page.blocks, this.languageId), | ||
values : HelperPage.arrayToObject(page.page_values, this.languageId), | ||
items: HelperPage.itemsToObject(page.page_items, this.languageId), | ||
blocks: HelperPage.blocksToObject(page.blocks, this.languageId), | ||
} | ||
@@ -252,6 +242,6 @@ | ||
//create current language value | ||
newValuePromises.push(ControllerAdminContent.createEmptyValue(key, null, page, this.languageId, database)); | ||
newValuePromises.push(HelperPage.createEmptyValue(key, null, page, this.languageId, database)); | ||
}else{ | ||
Object.keys(pageObject.values[key] || {}).forEach(subValue => { | ||
newValuePromises.push(ControllerAdminContent.createEmptyValue(key, subValue, page, this.languageId, database)); | ||
newValuePromises.push(HelperPage.createEmptyValue(key, subValue, page, this.languageId, database)); | ||
}); | ||
@@ -270,3 +260,3 @@ } | ||
newValuePromises.push( | ||
ControllerAdminContent.createEmptyItemValue(itemKey, key, null, page, this.languageId, database, i) | ||
HelperPage.createEmptyItemValue(itemKey, key, null, page, this.languageId, database, i) | ||
); | ||
@@ -279,3 +269,3 @@ | ||
newValuePromises.push( | ||
ControllerAdminContent.createEmptyItemValue(itemKey, key, subValueName, page, this.languageId, database, i) | ||
HelperPage.createEmptyItemValue(itemKey, key, subValueName, page, this.languageId, database, i) | ||
); | ||
@@ -282,0 +272,0 @@ }) |
@@ -10,3 +10,3 @@ const {ORM} = require('kohanajs'); | ||
end = null; | ||
page_type_id = null; | ||
page_type = null; | ||
current_page_version_id = null; | ||
@@ -24,7 +24,6 @@ | ||
["end", "Date"], | ||
["page_type_id", "Int"], | ||
["page_type", "String"], | ||
["current_page_version_id", "Int"] | ||
]); | ||
static hasMany = [ | ||
["page_id", "PageVersion"], | ||
["page_id", "PageAttribute"], | ||
@@ -31,0 +30,0 @@ ["page_id", "PageValue"], |
@@ -5,3 +5,2 @@ const {ORM} = require('kohanajs'); | ||
page_id = null; | ||
page_version_id = null; | ||
name = null; | ||
@@ -20,4 +19,3 @@ attribute_name = null; | ||
static belongsTo = new Map([ | ||
["page_id", "Page"], | ||
["page_version_id", "PageVersion"] | ||
["page_id", "Page"] | ||
]); | ||
@@ -24,0 +22,0 @@ } |
@@ -5,4 +5,3 @@ const {ORM} = require('kohanajs'); | ||
page_id = null; | ||
page_version_id = null; | ||
weight = null; | ||
weight = 0; | ||
@@ -16,4 +15,3 @@ static joinTablePrefix = 'page_block'; | ||
static belongsTo = new Map([ | ||
["page_id", "Page"], | ||
["page_version_id", "PageVersion"] | ||
["page_id", "Page"] | ||
]); | ||
@@ -20,0 +18,0 @@ static hasMany = [ |
@@ -5,5 +5,4 @@ const {ORM} = require('kohanajs'); | ||
page_id = null; | ||
page_version_id = null; | ||
name = null; | ||
weight = null; | ||
weight = 0; | ||
@@ -18,4 +17,3 @@ static joinTablePrefix = 'page_item'; | ||
static belongsTo = new Map([ | ||
["page_id", "Page"], | ||
["page_version_id", "PageVersion"] | ||
["page_id", "Page"] | ||
]); | ||
@@ -22,0 +20,0 @@ static hasMany = [ |
@@ -6,3 +6,2 @@ const {ORM} = require('kohanajs'); | ||
page_id = null; | ||
page_version_id = null; | ||
name = null; | ||
@@ -22,4 +21,3 @@ attribute_name = null; | ||
["language_id", "Language"], | ||
["page_id", "Page"], | ||
["page_version_id", "PageVersion"] | ||
["page_id", "Page"] | ||
]); | ||
@@ -26,0 +24,0 @@ } |
24
index.js
require('kohanajs').addNodeModule(__dirname); | ||
const ControllerAdminBlock = require('./classes/controller/admin/Block'); | ||
const ControllerAdminBlockAttribute = require('./classes/controller/admin/BlockAttribute'); | ||
const ControllerAdminBlockField = require('./classes/controller/admin/BlockField'); | ||
const ControllerAdminInput = require('./classes/controller/admin/Input'); | ||
const ControllerAdminPage = require('./classes/controller/admin/Page'); | ||
const ControllerAdminPageField = require('./classes/controller/admin/PageField'); | ||
const ControllerAdminPageFieldCollection = require('./classes/controller/admin/PageFieldCollection'); | ||
const ControllerAdminPageFieldCollectionField = require('./classes/controller/admin/PageFieldCollectionField'); | ||
const ControllerAdminPageFieldType = require('./classes/controller/admin/PageFieldType'); | ||
const ControllerAdminPageFieldTypeAttribute = require('./classes/controller/admin/PageTypeAttribute'); | ||
const ControllerAdminPageType = require('./classes/controller/admin/PageType'); | ||
const ControllerAdminPageTypeAttribute = require('./classes/controller/admin/PageTypeAttribute'); | ||
const ControllerAdminContent = require('./classes/controller/admin/Content'); | ||
module.exports = { | ||
ControllerAdminBlock, | ||
ControllerAdminBlockAttribute, | ||
ControllerAdminBlockField, | ||
ControllerAdminInput, | ||
ControllerAdminPage, | ||
ControllerAdminPageField, | ||
ControllerAdminPageFieldCollection, | ||
ControllerAdminPageFieldCollectionField, | ||
ControllerAdminPageFieldType, | ||
ControllerAdminPageFieldTypeAttribute, | ||
ControllerAdminPageType, | ||
ControllerAdminPageTypeAttribute, | ||
ControllerAdminContent, | ||
}; |
12
init.js
@@ -9,14 +9,2 @@ const {KohanaJS} = require('kohanajs') | ||
RouteCRUD.add('blocks', 'controller/admin/Block'); | ||
RouteCRUD.add('block_attributes', 'controller/admin/BlockAttributes'); | ||
RouteCRUD.add('block_fields', 'controller/admin/BlockFields'); | ||
RouteCRUD.add('inputs', 'controller/admin/Inputs'); | ||
RouteCRUD.add('page_fields', 'controller/admin/PageField'); | ||
RouteCRUD.add('page_field_collections', 'controller/admin/PageFieldCollection'); | ||
RouteCRUD.add('page_field_collection_fields', 'controller/admin/PageFieldCollectionField'); | ||
RouteCRUD.add('page_field_types', 'controller/admin/PageType'); | ||
RouteCRUD.add('page_field_type_attributes', 'controller/admin/PageType'); | ||
RouteCRUD.add('page_types', 'controller/admin/PageType'); | ||
RouteCRUD.add('page_type_attributes', 'controller/admin/PageTypeAttribute'); | ||
RouteList.add('/admin/pages/un-publish/:id', 'controller/admin/Page', 'unpublish'); | ||
@@ -23,0 +11,0 @@ RouteCRUD.add('pages', 'controller/admin/Page'); |
{ | ||
"name": "@kohanajs/mod-cms", | ||
"version": "3.2.0", | ||
"version": "4.0.0", | ||
"description": "The CMS module for KohanaJS", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
31044
22
767