Browse Source

Add support to component related styles

pull/3828/head
Artur Arseniev 5 years ago
parent
commit
f64a2635b7
  1. 53
      docs/api/pages.md
  2. 2
      docs/modules/Blocks.md
  3. 27
      src/commands/view/ComponentStyleClear.js
  4. 19
      src/css_composer/index.js
  5. 2
      src/css_composer/model/CssRule.js
  6. 7
      src/dom_components/model/Component.js
  7. 5
      src/dom_components/model/Components.js

53
docs/api/pages.md

@ -38,21 +38,24 @@ const pageManager = editor.Pages;
* [add][1] * [add][1]
* [get][2] * [get][2]
* [getAll][3] * [getAll][3]
* [getMain][4] * [getAllWrappers][4]
* [remove][5] * [getMain][5]
* [select][6] * [remove][6]
* [getSelected][7] * [select][7]
* [getSelected][8]
[Page]: page.html [Page]: page.html
[Component]: component.html
## add ## add
Add new page Add new page
### Parameters ### Parameters
* `props` **[Object][8]** Page properties * `props` **[Object][9]** Page properties
* `opts` **[Object][8]?** Options (optional, default `{}`) * `opts` **[Object][9]?** Options (optional, default `{}`)
### Examples ### Examples
@ -72,7 +75,7 @@ Remove page
### Parameters ### Parameters
* `page` **([String][9] | [Page])** Page or page id * `page` **([String][10] | [Page])** Page or page id
* `opts` (optional, default `{}`) * `opts` (optional, default `{}`)
### Examples ### Examples
@ -92,7 +95,7 @@ Get page by id
### Parameters ### Parameters
* `id` **[String][9]** Page id * `id` **[String][10]** Page id
### Examples ### Examples
@ -124,7 +127,21 @@ Get all pages
const arrayOfPages = pageManager.getAll(); const arrayOfPages = pageManager.getAll();
``` ```
Returns **[Array][10]<[Page]>** Returns **[Array][11]<[Page]>**
## getAllWrappers
Get wrapper components (aka body) from all pages and frames.
### Examples
```javascript
// Get all the `image` components from the project
const wrappers = pageManager.getAllWrappers();
const allImages = wrappers.map(wrp => wrp.findType('image')).flat();
```
Returns **[Array][11]<[Component]>**
## select ## select
@ -132,7 +149,7 @@ Change the selected page. This will switch the page rendered in canvas
### Parameters ### Parameters
* `page` **([String][9] | [Page])** Page or page id * `page` **([String][10] | [Page])** Page or page id
* `opts` (optional, default `{}`) * `opts` (optional, default `{}`)
### Examples ### Examples
@ -164,16 +181,18 @@ Returns **[Page]**
[3]: #getall [3]: #getall
[4]: #getmain [4]: #getallwrappers
[5]: #getmain
[5]: #remove [6]: #remove
[6]: #select [7]: #select
[7]: #getselected [8]: #getselected
[8]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object [9]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
[9]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String [10]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String
[10]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array [11]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array

2
docs/modules/Blocks.md

@ -225,7 +225,7 @@ Don't put non serializable properties, like functions, in your blocks, keep them
This will work, but if you try to save and reload a stored project, those will disappear. This will work, but if you try to save and reload a stored project, those will disappear.
### Avoid styles ### Avoid styles
Don't put styles in your blocks. Don't put styles in your blocks, keep them in your components.
```js ```js
// Your block // Your block
{ {

27
src/commands/view/ComponentStyleClear.js

@ -1,25 +1,22 @@
import { isArray } from 'underscore'; import { isArray, flatten } from 'underscore';
export default { export default {
run(ed, sender, opts = {}) { run(ed, s, opts = {}) {
const { target } = opts; const { target } = opts;
const dc = ed.DomComponents; let toRemove = [];
if (!target.get('styles')) return toRemove;
// Find all components in the project, of the target component type
const type = target.get('type'); const type = target.get('type');
const len = dc.getWrapper().findType(type).length; const wrappers = ed.Pages.getAllWrappers();
const toRemove = []; const len = flatten(wrappers.map(wrp => wrp.findType(type))).length;
// Remove component related styles only if there are no more components
// of that type in the project
if (!len) { if (!len) {
const rules = ed.CssComposer.getAll(); const rules = ed.CssComposer.getAll();
let toClear = target.get('style-signature'); toRemove = rules.filter(rule => rule.get('group') === `cmp:${type}`);
toClear = isArray(toClear) ? toClear : [toClear];
rules.forEach(rule => {
const selector = rule.selectorsToString();
toClear.forEach(part => {
part && selector.indexOf(part) >= 0 && toRemove.push(rule);
});
});
rules.remove(toRemove); rules.remove(toRemove);
} }

19
src/css_composer/index.js

@ -27,7 +27,8 @@
* @module CssComposer * @module CssComposer
*/ */
import { isArray, isUndefined } from 'underscore'; import { isArray, isString, isUndefined, each } from 'underscore';
import { isObject } from 'utils/mixins';
import defaults from './config/config'; import defaults from './config/config';
import CssRule from './model/CssRule'; import CssRule from './model/CssRule';
import CssRules from './model/CssRules'; import CssRules from './model/CssRules';
@ -243,14 +244,20 @@ export default () => {
/** /**
* Add a raw collection of rule objects * Add a raw collection of rule objects
* This method overrides styles, in case, of already defined rule * This method overrides styles, in case, of already defined rule
* @param {Array<Object>} data Array of rule objects, eg . [{selectors: ['class1'], style: {....}}, ..] * @param {String|Array<Object>} data CSS string or an array of rule objects, eg. [{selectors: ['class1'], style: {....}}, ..]
* @param {Object} opts Options * @param {Object} opts Options
* @param {Object} props Additional properties to add on rules
* @return {Array<Model>} * @return {Array<Model>}
* @private * @private
*/ */
addCollection(data, opts = {}) { addCollection(data, opts = {}, props = {}) {
var result = []; const result = [];
var d = data instanceof Array ? data : [data];
if (isString(data)) {
data = em.get('Parser').parseCss(data);
}
const d = data instanceof Array ? data : [data];
for (var i = 0, l = d.length; i < l; i++) { for (var i = 0, l = d.length; i < l; i++) {
var rule = d[i] || {}; var rule = d[i] || {};
@ -271,6 +278,8 @@ export default () => {
var updateStyle = !modelExists || !opts.avoidUpdateStyle; var updateStyle = !modelExists || !opts.avoidUpdateStyle;
const style = rule.style || {}; const style = rule.style || {};
isObject(props) && model.set(props, opts);
if (updateStyle) { if (updateStyle) {
let styleUpdate = opts.extend let styleUpdate = opts.extend
? { ...model.get('style'), ...style } ? { ...model.get('style'), ...style }

2
src/css_composer/model/CssRule.js

@ -40,6 +40,8 @@ export default class CssRule extends Model.extend(Styleable) {
// Used in view // Used in view
important: 0, important: 0,
group: '',
_undo: true _undo: true
}; };
} }

7
src/dom_components/model/Component.js

@ -176,6 +176,13 @@ export default class Component extends Model.extend(Styleable) {
}); });
if (!opt.temporary) { if (!opt.temporary) {
// Add component styles
const cssc = em && em.get('CssComposer');
const { styles, type } = this.attributes;
if (styles && cssc) {
cssc.addCollection(styles, {}, { group: `cmp:${type}` });
}
this.__postAdd(); this.__postAdd();
this.init(); this.init();
this.__isSymbolOrInst() && this.__initSymb(); this.__isSymbolOrInst() && this.__initSymb();

5
src/dom_components/model/Components.js

@ -82,6 +82,11 @@ export default Backbone.Collection.extend({
sels.remove(rulesRemoved.map(rule => rule.getSelectors().at(0))); sels.remove(rulesRemoved.map(rule => rule.getSelectors().at(0)));
if (!removed.opt.temporary) { if (!removed.opt.temporary) {
const hasStyles = removed.get('styles');
const cm = em.get('Commands');
em.get('Commands').run('core:component-style-clear', {
target: removed
});
// Deprecate 'style-signature' // Deprecate 'style-signature'
// const cm = em.get('Commands'); // const cm = em.get('Commands');
// const hasSign = removed.get('style-signature'); // const hasSign = removed.get('style-signature');

Loading…
Cancel
Save