* first cut of flexible layout * better drag handling * add drop targets to every row * enable drag and drop between columns and rows * enable persistance * add editing capability * chage rows to frames and columns to containers, switch draggable to whole frame object * Merge latest, resolve conflicts. Need to just apply these changes to Deep's branch and push * enhancements to drag targets * WIP in flexibleLayout, container.vue files - Refined classes and markup; - min-width changed to flex-basis; - Added toggle direction button; * Significant progress but still WIP - Refined classes and markup; - Layout toggling working; - Add Container working properly; - TODOs: fix sizing in empty container, fix bordering, more refinements; * add resizing of frames - still wip * Significant enhancements - Moved all CSS into flexibleLayout.vue; - Layout now improved for empty container and drop hints; - Proportional sizing now better for frames and containers; * Resize handle WIP * abstract splitter and logic into self contained component that will emit an event when mouse is moving * Resize handle WIP - Minor tweak to handle padding and hover; * add container resize todo persist * persist container resize * add frame header, fix column resize on last column * Refinements to resize-handle - Fixed sizing; - Transition on hover; - TODOs: needs is-dragging to maintain hover style while dragging; * fix drop hints showing after drop * move header * improve mouse move gesture * Added frame size indicator * add snapto functionality * Refined container and frame size indicators - Also added overflow handling to l-grid-view * improve resizing logic * add selection on frames * Various resizing-frames related - Fixed overflow - now frame widths can be collapsed to 5% minimum; - Sizing indicators refined, better positioning and layout; - Added grippy drag indicators to column heads; - TODOs: add column head cursors and hover effects, hide indicators when not in edit mode, handle nested layout and flex layouts while editing * Selecting and emtpy layout messaging - Better empty layout message; - Moved s-selected to proper element in c-fl-frame; * Drop-hint and sizing related various - Drop-hints for first placeholder container now display; - Drop-hints moved into drag-wrapper; * add delete frame * Editing various - Adjust Snow theme constants related to editing; - Changed delete message wording; * Updated icon and added description * add toggle and remove container to toolbar * miscellaneous cleanup * add container button to toolbar * improve toolbar * code cleanup in plugin.js * Various icons, toolbar separator - Copied in c-toolbar__separator and associated changes in _controls from Pegah's layout_alpha branch - may have conflicts later. - Added separator to FL toolbar; - Updated icons for grippy-ew, toolbar icons; * add check for empty containers" * logic to resize frames on drop * fix delete frame and persisting toolbar * Significant changes to edit / selection styling - Both Flexible and fixed Display Layouts addressed; - Both themes addressed; - Changed drop-hint icon to icon-plus; * add correct icons to frame header and fix toolbars showing up in wrong views * Moving and resizing various - Cursors; - Grippy added to frame resize-handle, WIP!; * add container reordering * add frame/no frame support to toolbar' * fix regression of resize handles showing after last frame in container * force selection of flexible-layout when editing is first clicked, to apply correct toolbar * make changes to simplify toolbar * Modified sizing algorithm slightly * make changes reviewer requested * fix regression that causes top drop hint to not show * remove unused variables and bind events to vue * unsub selection before destroy
164 lines
6.8 KiB
JavaScript
164 lines
6.8 KiB
JavaScript
/*****************************************************************************
|
|
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
* as represented by the Administrator of the National Aeronautics and Space
|
|
* Administration. All rights reserved.
|
|
*
|
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
* Open MCT includes source code licensed under additional open source
|
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
* this source code distribution or the Licensing information page available
|
|
* at runtime from the About dialog for additional information.
|
|
*****************************************************************************/
|
|
|
|
define([
|
|
'./flexibleLayoutViewProvider',
|
|
'./utils/container'
|
|
], function (
|
|
FlexibleLayoutViewProvider,
|
|
Container
|
|
) {
|
|
return function plugin() {
|
|
|
|
return function install(openmct) {
|
|
openmct.objectViews.addProvider(new FlexibleLayoutViewProvider(openmct));
|
|
|
|
openmct.types.addType('flexible-layout', {
|
|
name: "Flexible Layout",
|
|
creatable: true,
|
|
description: "A fluid, flexible layout canvas that can display multiple objects in rows or columns.",
|
|
cssClass: 'icon-flexible-layout',
|
|
initialize: function (domainObject) {
|
|
domainObject.configuration = {
|
|
containers: [new Container.default(50), new Container.default(50)],
|
|
rowsLayout: false
|
|
};
|
|
}
|
|
});
|
|
|
|
openmct.toolbars.addProvider({
|
|
name: "Flexible Layout Toolbar",
|
|
key: "flex-layout",
|
|
description: "A toolbar for objects inside a Flexible Layout.",
|
|
forSelection: function (selection) {
|
|
let context = selection[0].context;
|
|
|
|
return (openmct.editor.isEditing() && context && context.type &&
|
|
(context.type === 'flexible-layout' || context.type === 'container' || context.type === 'frame'));
|
|
},
|
|
toolbar: function (selection) {
|
|
|
|
let primary = selection[0],
|
|
parent = selection[1],
|
|
deleteFrame,
|
|
toggleContainer,
|
|
deleteContainer,
|
|
addContainer,
|
|
toggleFrame,
|
|
separator;
|
|
|
|
addContainer = {
|
|
control: "button",
|
|
domainObject: parent ? parent.context.item : primary.context.item,
|
|
method: parent ? parent.context.addContainer : primary.context.addContainer,
|
|
key: "add",
|
|
icon: "icon-plus-in-rect",
|
|
title: 'Add Container'
|
|
};
|
|
|
|
separator = {
|
|
control: "separator",
|
|
domainObject: selection[0].context.item,
|
|
key: "separator"
|
|
};
|
|
|
|
toggleContainer = {
|
|
control: 'toggle-button',
|
|
key: 'toggle-layout',
|
|
domainObject: parent ? parent.context.item : primary.context.item,
|
|
property: 'configuration.rowsLayout',
|
|
options: [
|
|
{
|
|
value: false,
|
|
icon: 'icon-columns',
|
|
title: 'Columns'
|
|
},
|
|
{
|
|
value: true,
|
|
icon: 'icon-rows',
|
|
title: 'Rows'
|
|
}
|
|
]
|
|
};
|
|
|
|
if (primary.context.type === 'frame') {
|
|
|
|
deleteFrame = {
|
|
control: "button",
|
|
domainObject: primary.context.item,
|
|
method: primary.context.method,
|
|
key: "remove",
|
|
icon: "icon-trash",
|
|
title: "Remove Frame"
|
|
};
|
|
toggleFrame = {
|
|
control: "toggle-button",
|
|
domainObject: parent.context.item,
|
|
property: `configuration.containers[${parent.context.index}].frames[${primary.context.index}].noFrame`,
|
|
options: [
|
|
{
|
|
value: false,
|
|
icon: 'icon-frame-hide',
|
|
title: "Hide frame"
|
|
},
|
|
{
|
|
value: true,
|
|
icon: 'icon-frame-show',
|
|
title: "Show frame"
|
|
}
|
|
]
|
|
};
|
|
|
|
|
|
} else if (primary.context.type === 'container') {
|
|
|
|
deleteContainer = {
|
|
control: "button",
|
|
domainObject: primary.context.item,
|
|
method: primary.context.method,
|
|
key: "remove",
|
|
icon: "icon-trash",
|
|
title: "Remove Container"
|
|
};
|
|
|
|
} else if (primary.context.type === 'flexible-layout') {
|
|
|
|
addContainer = {
|
|
control: "button",
|
|
domainObject: primary.context.item,
|
|
method: primary.context.addContainer,
|
|
key: "add",
|
|
icon: "icon-plus-in-rect",
|
|
title: 'Add Container'
|
|
};
|
|
|
|
}
|
|
|
|
let toolbar = [toggleContainer, addContainer, toggleFrame, separator, deleteFrame, deleteContainer];
|
|
|
|
return toolbar.filter(button => button !== undefined);
|
|
}
|
|
});
|
|
};
|
|
};
|
|
});
|