merge develop -> google-login

This commit is contained in:
Gustavo Fuhr 2022-11-30 04:17:06 -03:00
commit 31411997bc
163 changed files with 3959 additions and 5032 deletions

View File

@ -27,8 +27,7 @@
"clean-webpack-plugin": "^4.0.0-alpha.0",
"core-js": "^3.15.2",
"webpack": "^5.74.0",
"webpack-cli": "^4.7.2",
"webpack-merge": "^5.8.0"
"webpack-cli": "^4.10.0"
},
"dependencies": {}
}

View File

@ -11,10 +11,16 @@ context('Relationship Topics', () => {
cy.contains('Try it Now!').first().click();
cy.get('[test-id="11-15-relationship"]').first().click({ force: true });
cy.get('[test-id="11-15-relationship"]').should('exist');
cy.matchImageSnapshot('addRelationship');
});
it('Delete Relationship', () => {
cy.contains('Features').first().click();
cy.get(`[aria-label="Add Relationship"]`).first().click();
cy.contains('Try it Now!').first().click();
cy.get('[test-id="11-15-relationship"]').click({ force: true });
cy.get('body').type('{backspace}');

View File

@ -217,5 +217,8 @@
},
"shortcut-help-pane.undo": {
"defaultMessage": "Rückgängerausgabe"
},
"icon-picker.show-images": {
"defaultMessage": "Bilder anzeigen"
}
}

View File

@ -122,6 +122,9 @@
"editor.try-welcome-mobile": {
"defaultMessage": "This edition space showcases some of the mindmap editor capabilities!"
},
"icon-picker.show-images": {
"defaultMessage": "Show images"
},
"link.help_text": {
"defaultMessage": "Address is not valid"
},

View File

@ -211,5 +211,8 @@
},
"shortcut-help-pane.undo": {
"defaultMessage": "Deshacer cambios"
},
"icon-picker.show-images": {
"defaultMessage": "Mostrar imagenes"
}
}

View File

@ -211,5 +211,8 @@
},
"shortcut-help-pane.undo": {
"defaultMessage": "Annuler l'édition"
},
"icon-picker.show-images": {
"defaultMessage": "Afficher les images"
}
}

View File

@ -8,7 +8,7 @@
"cy:run": "cypress run",
"lint": "eslint src --ext js,ts,tsx",
"test:integration": "start-server-and-test 'yarn playground' http-get://localhost:8081 'yarn cy:run'",
"test": "yarn test:integration",
"test": "yarn test:unit test:integration",
"test:unit": "jest ./test/unit/* --detectOpenHandles",
"i18n:extract": "formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/en.json",
"i18n:compile": "for lang in {'es','en','fr','de','zh','ru'};do formatjs compile lang/${lang}.json --ast --out-file src/compiled-lang/${lang}.json;done"
@ -20,7 +20,7 @@
"devDependencies": {
"@babel/preset-env": "^7.19.4",
"@formatjs/cli": "^5.1.3",
"@testing-library/react": "^12.0.0",
"@testing-library/react": "^13.4.0",
"@types/jest": "^29.0.0",
"babel-plugin-transform-require-context": "^0.1.1",
"babel-polyfill": "^6.26.0",
@ -28,8 +28,8 @@
"copy-webpack-plugin": "^10.2.1",
"css-loader": "^6.7.1",
"cypress": "^10.11.0",
"eslint": "^7.14.0",
"cypress-image-snapshot": "^4.0.1",
"eslint": "^7.14.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-react": "^7.31.10",
"eslint-plugin-react-hooks": "^4.6.0",
@ -40,24 +40,20 @@
"style-loader": "^3.3.1",
"ts-jest": "^27.1.0",
"typescript": "^4.8.4",
"webpack": "^5.74.0",
"webpack-merge": "^5.8.0"
"webpack": "^5.75.0"
},
"dependencies": {
"@emotion/styled": "^11.10.5",
"@wisemapping/mindplot": "^5.0.15",
"emoji-picker-react": "^4.4.4",
"react-color": "^2.19.3",
"react-dom": "^18.2.0",
"styled-components": "^5.3.6"
"react-loader-spinner": "^5.3.4"
},
"peerDependencies": {
"@emotion": "^11.10.5",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@mui/icons-material": "^5.9.3",
"@mui/material": "^5.10.11",
"lodash": "^4.17.14",
"@mui/material/esm": "^5.10.11",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-intl": "^6.2.1",

View File

@ -32,7 +32,7 @@ class Editor {
}
isMapLoadded(): boolean {
return this.component?.getDesigner()?.getMindmap() != null;
return this.component?.isLoaded();
}
save(minor: boolean): void {
@ -57,9 +57,9 @@ class Editor {
mapId: string,
persistenceManager: PersistenceManager,
widgetManager: WidgetManager,
): void {
): Promise<void> {
this.component.buildDesigner(persistenceManager, widgetManager);
this.component.loadMap(mapId);
return this.component.loadMap(mapId);
}
registerEvents(canvasUpdate: (timestamp: number) => void, capability: Capability): void {
@ -83,7 +83,6 @@ class Editor {
// Is the save action enabled ... ?
if (!capability.isHidden('save')) {
// Register unload save ...
window.addEventListener('beforeunload', () => {
this.component.save(false);
this.component.unlockMap();
@ -92,7 +91,7 @@ class Editor {
// Autosave on a fixed period of time ...
setInterval(() => {
this.component.save(false);
}, 10000);
}, 5000);
}
}
}

View File

@ -251,6 +251,12 @@
"value": "Diese Edition zeigt einige der Mindmap-Funktionen!"
}
],
"icon-picker.show-images": [
{
"type": 0,
"value": "Bilder anzeigen"
}
],
"link.help_text": [
{
"type": 0,

View File

@ -245,6 +245,12 @@
"value": "This edition space showcases some of the mindmap editor capabilities!"
}
],
"icon-picker.show-images": [
{
"type": 0,
"value": "Show images"
}
],
"link.help_text": [
{
"type": 0,

View File

@ -245,6 +245,12 @@
"value": "¡Este espacio de edición muestra algunas de las capacidades de mapas mentales!"
}
],
"icon-picker.show-images": [
{
"type": 0,
"value": "Mostrar imagenes"
}
],
"link.help_text": [
{
"type": 0,

View File

@ -245,6 +245,12 @@
"value": "Cet espace d'édition présente certaines des fonctionnalités des cartes mentales!"
}
],
"icon-picker.show-images": [
{
"type": 0,
"value": "Afficher les images"
}
],
"link.help_text": [
{
"type": 0,

View File

@ -32,7 +32,7 @@ const ColorPicker = (props: {
<Box component="div" sx={{ m: 2 }}>
<ReactColorPicker
color={props.colorModel.getValue() || '#fff'}
onChangeComplete={(color) => {
onChangeComplete={(color: { hex: string }) => {
props.colorModel.setValue(color.hex);
props.closeModal();
}}
@ -40,7 +40,7 @@ const ColorPicker = (props: {
width={216}
circleSpacing={9}
circleSize={18}
></ReactColorPicker>
/>
</Box>
);
};

View File

@ -21,26 +21,12 @@
"task_50",
"task_75",
"task_100",
"hard_cd",
"hard_computer",
"hard_controller",
"hard_driver_disk",
"hard_ipod",
"hard_printer",
"hard_webcam",
"hard_microphone",
"things_address_book",
"things_wrench",
"things_pin",
"things_window-layout",
"things_bubbles",
"object_key",
"object_pencil",
"object_magnifier",
"object_clip",
"object_music",
"object_star",
"object_house"
"object_music"
]
},
{
@ -50,21 +36,14 @@
"chart_curve",
"chart_pie",
"chart_organisation",
"thumb_thumb_up",
"thumb_thumb_down",
"tick_tick",
"tick_cross",
"onoff_add",
"onoff_delete",
"onoff_status_offline",
"onoff_status_online",
"money_dollar",
"money_euro",
"money_coins",
"money_ruby",
"time_calendar",
"time_clock",
"time_hourglass",
"sign_warning",
"sign_info",
"sign_help",
@ -76,14 +55,6 @@
"soft_folder_explore",
"soft_rss",
"soft_penguin",
"arrowc_rotate_anticlockwise",
"arrowc_rotate_clockwise",
"arrowc_turn_left",
"arrowc_turn_right",
"mail_envelop",
"mail_mailbox",
"mail_edit",
"mail_list",
"flag_blue",
"flag_green",
"flag_orange",

View File

@ -3,6 +3,7 @@ import React, { ReactElement } from 'react';
import iconGroups from './iconGroups.json';
import { SvgImageIcon } from '@wisemapping/mindplot';
import NodeProperty from '../../../../../classes/model/node-property';
import { SvgIcon } from './styled';
type IconImageTab = {
iconModel: NodeProperty<string>;
@ -14,8 +15,7 @@ const IconImageTab = ({ iconModel, triggerClose }: IconImageTab): ReactElement =
{iconGroups.map((family, i) => (
<span key={i}>
{family.icons.map((icon: string) => (
<img
className="panelIcon"
<SvgIcon
key={icon}
src={SvgImageIcon.getImageUrl(icon)}
onClick={() => {

View File

@ -0,0 +1,29 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.
*/
import styled from 'styled-components';
export const SvgIcon = styled.img`
width: 25px;
height: 25px;
margin-left: 4px;
margin-top: 3px;
cursor: pointer;
&:hover {
background-color: #efefef;
}
`;

View File

@ -23,6 +23,7 @@ import IconImageTab from './image-icon-tab';
import Switch from '@mui/material/Switch';
import FormGroup from '@mui/material/FormGroup';
import FormControlLabel from '@mui/material/FormControlLabel';
import { FormattedMessage } from 'react-intl';
type IconPickerProp = {
triggerClose: () => void;
@ -53,7 +54,10 @@ const IconPicker = ({ triggerClose, iconModel }: IconPickerProp): ReactElement =
return (
<div style={{ padding: '5px' }}>
<FormGroup>
<FormControlLabel label="Show Images" control={<Switch onChange={handleCheck} />} />
<FormControlLabel
label={<FormattedMessage id="icon-picker.show-images" defaultMessage="Show images" />}
control={<Switch onChange={handleCheck} />}
/>
</FormGroup>
{checked && (

View File

@ -17,10 +17,11 @@
*/
import React, { ReactElement } from 'react';
import { FormattedMessage } from 'react-intl';
import { ShortcutsContainer } from './styled';
const KeyboardShorcutsHelp = (): ReactElement => {
return (
<div id="keyboardTable">
<ShortcutsContainer>
<table>
<colgroup>
<col width="40%" />
@ -247,7 +248,7 @@ const KeyboardShorcutsHelp = (): ReactElement => {
</tr>
</tbody>
</table>
</div>
</ShortcutsContainer>
);
};
export default KeyboardShorcutsHelp;

View File

@ -0,0 +1,35 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.
*/
import styled from 'styled-components';
export const ShortcutsContainer = styled.div`
font-size: 13px;
width: 100%;
& td {
padding: 3px;
white-space: nowrap;
}
& th {
padding: 5px;
white-space: nowrap;
}
& th {
background-color: #000000;
color: #ffffff;
}
`;

View File

@ -49,7 +49,7 @@ const TopicNote = (props: {
margin="dense"
value={note}
onChange={(event) => setNote(event.target.value)}
></Input>
/>
<br />
<SaveAndDelete
model={props.noteModel}

View File

@ -43,7 +43,7 @@ import MapInfo from '../../classes/model/map-info';
import { useIntl } from 'react-intl';
interface AppBarProps {
model: Editor;
model: Editor | undefined;
mapInfo: MapInfo;
capability: Capability;
onAction?: (type: ToolbarActionType) => void;
@ -59,6 +59,14 @@ const keyTooltip = (msg: string, key: string): string => {
return `${msg} (${isMac ? '⌘' : 'Ctrl'} + ${key})`;
};
const StarredOnStyle = {
color: '#FDDA0D',
};
const StarredOffStyle = {
color: 'gray',
};
const AppBar = ({
model,
mapInfo,
@ -95,7 +103,7 @@ const AppBar = ({
onClick: () => history.back(),
},
{
render: () => <img src={LogoTextBlackSvg} />,
render: () => <img src={LogoTextBlackSvg} aria-label="WiseMappping" />,
visible: !capability.isHidden('appbar-title'),
},
{
@ -180,9 +188,7 @@ const AppBar = ({
<IconButton size="small" onClick={handleStarredOnClick}>
<StarRateRoundedIcon
color="action"
style={{
color: isStarred ? 'yellow' : 'gray',
}}
style={isStarred ? StarredOnStyle : StarredOffStyle}
/>
</IconButton>
</Tooltip>

View File

@ -15,16 +15,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import React, { ReactElement, useCallback, useEffect, useState } from 'react';
import React, { ReactElement, useEffect, useRef, useState } from 'react';
import Popover from '@mui/material/Popover';
import Model from '../classes/model/editor';
import { Vortex } from 'react-loader-spinner';
import { IntlProvider } from 'react-intl';
import {
PersistenceManager,
Designer,
DesignerKeyboard,
MindplotWebComponent,
EditorRenderMode,
} from '@wisemapping/mindplot';
@ -42,6 +42,7 @@ import { ToolbarActionType } from './toolbar/ToolbarActionType';
import MapInfo from '../classes/model/map-info';
import EditorToolbar from './editor-toolbar';
import ZoomPanel from './zoom-panel';
import { SpinnerCentered } from './style';
export type EditorOptions = {
mode: EditorRenderMode;
@ -68,6 +69,7 @@ const Editor = ({
accountConfiguration,
}: EditorProps): ReactElement => {
const [model, setModel] = useState<Model | undefined>();
const mindplotRef = useRef(null);
// This is required to redraw in case of chansges in the canvas...
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@ -76,13 +78,24 @@ const Editor = ({
const [popoverOpen, popoverTarget, widgetManager] = DefaultWidgetManager.useCreate();
const capability = new Capability(options.mode, mapInfo.isLocked());
const mindplotRef = useCallback((component: MindplotWebComponent) => {
// Initialized model ...
const model = new Model(component);
model.loadMindmap(mapInfo.getId(), persistenceManager, widgetManager);
model.registerEvents(setCanvasUpdate, capability);
setModel(model);
}, []);
useEffect(() => {
if (!model) {
const model = new Model(mindplotRef.current);
model
.loadMindmap(mapInfo.getId(), persistenceManager, widgetManager)
.then(() => {
setCanvasUpdate(Date.now());
model.registerEvents(setCanvasUpdate, capability);
})
.catch((e) => {
console.error(e);
window.newrelic?.noticeError(
new Error(`Unexpected error loading map ${mapInfo.getId()} = ${JSON.stringify(e)}`),
);
});
setModel(model);
}
}, [mindplotRef]);
useEffect(() => {
if (options.enableKeyboardEvents) {
@ -134,6 +147,18 @@ const Editor = ({
capability={capability}
message={mapInfo.isLocked() ? mapInfo.getLockedMessage() : ''}
/>
{!model?.isMapLoadded() && (
<SpinnerCentered>
<Vortex
visible={true}
height="160"
width="160"
ariaLabel="vortex-loading"
colors={['#ffde1a', '#ffce00', '#ffa700', '#ff8d00', '#ff7400', '#ffde1a']}
/>
</SpinnerCentered>
)}
</IntlProvider>
</ThemeProvider>
);

View File

@ -0,0 +1,28 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.
*/
import styled from 'styled-components';
export const SpinnerCentered = styled.div`
position: absolute;
top: 50%;
left: 50%;
margin-top: -50px;
margin-left: -50px;
width: 100px;
height: 100px;
`;

View File

@ -16,7 +16,7 @@
* limitations under the License.
*/
import React, { useState } from 'react';
import { Notifier } from './styled';
import { CloseButton, InfoDialog, InfoDialogContent, Notifier } from './styled';
import { useIntl } from 'react-intl';
import CloseDialogSvg from '../../../images/close-dialog-icon.svg';
@ -29,7 +29,6 @@ export type FooterPropsType = {
const WarningDialog = ({ capability, message }: FooterPropsType): React.ReactElement => {
const intl = useIntl();
const [dialogClass, setDialogClass] = useState('tryInfoPanel');
let msgExt, msg: string;
if (capability.mode !== 'viewonly' && capability.mode !== 'showcase' && capability.isMobile) {
@ -68,30 +67,30 @@ const WarningDialog = ({ capability, message }: FooterPropsType): React.ReactEle
});
}
// if the toolbar is present, the alert must not overlap
const alertTopAdjustmentStyle = 'tryInfoPanelWithToolbar';
const [open, setOpen] = useState(msgExt || message);
return (
<>
<Notifier id="headerNotifier"></Notifier>
{(msgExt || message) && (
<div className={dialogClass + ' ' + alertTopAdjustmentStyle}>
<div className="tryInfoPanelInner">
<div className="closeButton">
{open && (
<InfoDialog>
<InfoDialogContent>
<CloseButton>
<button
onClick={(e) => {
setDialogClass('tryInfoPanelClosed');
setOpen(false);
e.preventDefault();
e.stopPropagation();
}}
name="close"
aria-label="Close"
>
<img src={CloseDialogSvg} />
<img src={CloseDialogSvg} title="Close" />
</button>
</div>
</CloseButton>
{msgExt && <p>{`${msg} ${msgExt}`}</p>}
{message && <p>{message}</p>}
</div>
</div>
</InfoDialogContent>
</InfoDialog>
)}
</>
);

View File

@ -47,3 +47,42 @@ export const Notifier = styled.div`
bottom: 10px;
font-family: 'Montserrat', Arial, Helvetica, sans-serif;
`;
export const CloseButton = styled.div`
position: absolute;
top: 5px;
right: 5px;
button {
cursor: pointer;
border-style: hidden;
background-color: transparent;
padding: 0px;
}
button img {
width: 18px;
height: 18px;
filter: invert(73%) sepia(21%) saturate(4699%) hue-rotate(357deg) brightness(98%) contrast(108%);
}
`;
export const InfoDialog = styled.div`
position: absolute;
text-align: center;
top: 70px;
left: 0;
right: 0;
background-color: white;
border: solid 2px #ffa800;
margin: auto;
border-radius: 9px;
width: 80%;
`;
export const InfoDialogContent = styled.div`
padding-top: 10px;
padding-bottom: 10px;
padding-left: 5px;
padding-right: 5px;
`;

View File

@ -1,11 +1,6 @@
/********************************************************************************/
/* Header & Toolbar Styles */
/********************************************************************************/
html {
/* avoid bootstrap overriding font-size and breaking Mui */
font-size: initial;
}
body {
width: 100vw;
height: 100vh;
@ -18,105 +13,8 @@ body {
width: 100%;
height: 100%;
}
.panelIcon {
width: 25px;
height: 25px;
margin-left: 4px;
margin-top: 3px;
cursor: pointer;
}
.panelIcon:hover {
background-color: #efefef;
}
.wise-editor .popover {
font-size: 13px;
max-width: none;
}
#keyboardTable {
font-size: 13px;
width: 100%;
}
#keyboardTable td {
padding: 3px;
white-space: nowrap;
}
#keyboardTable th {
padding: 5px;
white-space: nowrap;
}
#keyboardTable th {
background-color: #000000;
color: #ffffff;
}
.tryInfoPanel {
position: absolute;
text-align: center;
left: 0;
right: 0;
background-color: white;
border: solid 2px #ffa800;
margin: auto;
border-radius: 9px;
width: 80%;
}
@media (min-width: 600px) {
.tryInfoPanel {
font-size: 15px;
}
}
@media (max-width: 600px) {
.tryInfoPanel {
font-size: 13px;
}
}
.tryInfoPanel .tryInfoPanelInner {
padding-top: 10px;
padding-bottom: 10px;
padding-left: 5px;
padding-right: 5px;
}
.tryInfoPanel .tryInfoPanelInner .closeButton {
position: absolute;
top: 5px;
right: 5px;
}
.tryInfoPanel .tryInfoPanelInner .closeButton button {
cursor: pointer;
border-style: hidden;
background-color: transparent;
padding: 0px;
}
.tryInfoPanel .tryInfoPanelInner .closeButton button img {
width: 18px;
height: 18px;
filter: invert(73%) sepia(21%) saturate(4699%) hue-rotate(357deg) brightness(98%) contrast(108%);
}
.tryInfoPanelWithToolbar {
top: 75px;
}
.tryInfoPanelWithoutToolbar {
top: 5px;
}
.tryInfoPanelClosed {
display: none;
}
.tryInfoPanel>p {
justify-content: center;
}

View File

@ -53,6 +53,9 @@ declare global {
['mindplot-component']: MindplotWebComponentInterface;
}
}
interface Window {
newrelic: { noticeError: (Error) => void };
}
}
export {

View File

@ -42,9 +42,10 @@ const container = document.getElementById('root');
const root = createRoot(container!);
root.render(
<Editor
mapInfo={new MapInfoImpl('welcome', 'Develop Map Title', false)}
mapInfo={new MapInfoImpl(mapId, 'Develop Map Title', false)}
options={options}
persistenceManager={persistence}
onAction={(action) => console.log('action called:', action)}
onLoad={initialization}
/>);
/>,
);

File diff suppressed because one or more lines are too long

View File

@ -14,6 +14,7 @@
"allowJs": true,
"esModuleInterop": true,
"declaration": true,
"strictNullChecks": false,
"rootDirs": [
"src",
],

View File

@ -11,8 +11,7 @@ module.exports = {
},
stats: {
errorDetails: true,
},
entry: {
}, entry: {
'editor.bundle': path.join(__dirname, 'src', 'index.tsx'),
},
mode: 'development',

View File

@ -7,14 +7,24 @@ const prodConfig = {
usedExports: true,
minimize: true,
},
externals: {
externals: [{
'react': 'react',
'react-dom': 'react-dom',
'react-intl': 'react-intl',
'@emotion/styled': '@emotion/styled',
'@emotion/react': '@emotion/react',
"@mui/system": "@mui/system",
"@mui": "@mui",
"@mui/material": "@mui/material",
"@mui/material/esm": "@mui/material/esm",
'styled-components': 'styled-components',
'xml-formatter': 'xml-formatter',
'lodash-es': 'lodash-es',
},
/^@mui/,
/^lodash/
],
plugins: [new CleanWebpackPlugin()],
};

View File

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
sodipodi:docname="arrowc_rotate_anticlockwise.svg"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs391" /><sodipodi:namedview
id="namedview389"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.0742188"
inkscape:cx="255.53455"
inkscape:cy="256"
inkscape:window-width="1312"
inkscape:window-height="776"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" />
<path
style="fill:#00B4D7;"
d="M395.16,84.375c56.665,42.354,93.55,109.84,93.55,186.169c0,128.572-104.139,232.711-232.711,232.711 S23.288,399.117,23.288,270.545c0-15.94,1.629-31.532,4.654-46.542H105.9c-4.538,14.661-6.981,30.368-6.981,46.542 c0,86.802,70.278,157.08,157.08,157.08s157.08-70.28,157.08-157.08c0-56.897-30.368-106.466-75.631-134.042v64.229h-75.631V8.744 h180.351v75.631H395.16z"
id="path342" />
<path
d="M255.999,512c-64.519,0-125.161-25.109-170.754-70.702S14.543,335.063,14.543,270.545c0-16.14,1.624-32.38,4.827-48.27 l1.414-7.016h96.976l-3.507,11.33c-4.372,14.127-6.59,28.917-6.59,43.956c0,81.793,66.543,148.336,148.336,148.336 s148.336-66.543,148.336-148.336c0-46.623-21.467-89.481-58.142-117.489v56.42h-93.12V0h197.84v93.12H419.36 c21.007,19.331,38.618,42.349,51.603,67.6c17.579,34.187,26.494,71.138,26.494,109.824c0,64.519-25.109,125.161-70.702,170.754 C381.159,486.89,320.518,512,255.999,512z M35.214,232.746c-2.113,12.501-3.182,25.184-3.182,37.797 c0,59.848,23.29,116.097,65.58,158.387s98.54,65.58,158.387,65.58s116.097-23.29,158.387-65.58s65.58-98.54,65.58-158.387 c0-35.877-8.263-70.137-24.557-101.827c-15.516-30.171-38.159-56.915-65.484-77.338l-21.07-15.748h64.569V17.489H270.561v174.497 h58.143v-71.05l13.294,8.1c23.898,14.56,43.889,35.003,57.811,59.121c14.402,24.946,22.013,53.435,22.013,82.389 c0,91.436-74.388,165.824-165.824,165.824c-91.435,0-165.824-74.388-165.824-165.824c0-12.823,1.446-25.489,4.307-37.797H35.214 V232.746z"
id="path350" />
<g
id="g358">
</g>
<g
id="g360">
</g>
<g
id="g362">
</g>
<g
id="g364">
</g>
<g
id="g366">
</g>
<g
id="g368">
</g>
<g
id="g370">
</g>
<g
id="g372">
</g>
<g
id="g374">
</g>
<g
id="g376">
</g>
<g
id="g378">
</g>
<g
id="g380">
</g>
<g
id="g382">
</g>
<g
id="g384">
</g>
<g
id="g386">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
sodipodi:docname="arrowc_rotate_clockwise.svg"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs869" /><sodipodi:namedview
id="namedview867"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.0820312"
inkscape:cx="255.53791"
inkscape:cy="256"
inkscape:window-width="1296"
inkscape:window-height="776"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" />
<path
style="fill:#00B4D7;"
d="M116.838,84.375c-56.665,42.354-93.55,109.84-93.55,186.169 c0,128.572,104.139,232.711,232.711,232.711S488.71,399.117,488.71,270.545c0-15.94-1.629-31.532-4.654-46.542h-77.958 c4.538,14.661,6.981,30.368,6.981,46.542c0,86.802-70.278,157.08-157.08,157.08s-157.08-70.28-157.08-157.08 c0-56.897,30.368-106.466,75.631-134.042v64.229h75.631V8.744H69.83v75.631H116.838z"
id="path820" />
<path
d="M255.999,512c-64.519,0-125.161-25.109-170.754-70.702S14.544,335.063,14.544,270.545c0-38.687,8.915-75.637,26.494-109.824 c12.985-25.251,30.596-48.27,51.602-67.6H61.086V0h197.84v209.475h-93.12v-56.42c-36.676,28.007-58.142,70.865-58.142,117.489 c0,81.793,66.543,148.336,148.336,148.336s148.336-66.543,148.336-148.336c0-15.039-2.218-29.829-6.59-43.957l-3.507-11.33h96.976 l1.414,7.016c3.203,15.89,4.827,32.13,4.827,48.27c0,64.519-25.109,125.161-70.702,170.754C381.159,486.89,320.518,512,255.999,512z M78.574,75.631h64.568l-21.069,15.748c-27.324,20.423-49.967,47.167-65.483,77.338c-16.296,31.689-24.557,65.948-24.557,101.827 c0,59.848,23.29,116.097,65.58,158.387c42.289,42.29,98.539,65.58,158.387,65.58s116.097-23.29,158.387-65.58 s65.58-98.54,65.58-158.387c0-12.615-1.069-25.298-3.182-37.797h-59.268c2.861,12.308,4.307,24.976,4.307,37.797 c0,91.436-74.388,165.824-165.824,165.824c-91.435,0-165.824-74.388-165.824-165.824c0-28.953,7.612-57.443,22.013-82.389 c13.923-24.118,33.914-44.561,57.811-59.121l13.294-8.1v71.051h58.143V17.489H78.574V75.631z"
id="path828" />
<g
id="g836">
</g>
<g
id="g838">
</g>
<g
id="g840">
</g>
<g
id="g842">
</g>
<g
id="g844">
</g>
<g
id="g846">
</g>
<g
id="g848">
</g>
<g
id="g850">
</g>
<g
id="g852">
</g>
<g
id="g854">
</g>
<g
id="g856">
</g>
<g
id="g858">
</g>
<g
id="g860">
</g>
<g
id="g862">
</g>
<g
id="g864">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
sodipodi:docname="arrowc_turn_left.svg"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs1277" /><sodipodi:namedview
id="namedview1275"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.0820312"
inkscape:cx="255.53791"
inkscape:cy="256"
inkscape:window-width="1296"
inkscape:window-height="776"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" />
<polygon
style="fill:#00B4D7;"
points="395.386,476.106 503.013,476.106 503.013,171.161 186.109,171.161 257.861,99.409 198.068,39.616 12.71,224.975 198.068,410.333 257.861,350.54 186.109,278.789 395.386,278.789 "
id="polygon1236" />
<path
d="M512,485.093H386.398V287.776H207.806l62.765,62.765l-72.503,72.503L0,224.975L198.068,26.907l72.503,72.502l-62.765,62.765 H512V485.093z M404.372,467.119h89.654V180.148H164.413l80.739-80.739l-47.084-47.083L25.419,224.975l172.649,172.649l47.084-47.084 l-80.739-80.739h239.959V467.119z"
id="path1242" />
<g
id="g1244">
</g>
<g
id="g1246">
</g>
<g
id="g1248">
</g>
<g
id="g1250">
</g>
<g
id="g1252">
</g>
<g
id="g1254">
</g>
<g
id="g1256">
</g>
<g
id="g1258">
</g>
<g
id="g1260">
</g>
<g
id="g1262">
</g>
<g
id="g1264">
</g>
<g
id="g1266">
</g>
<g
id="g1268">
</g>
<g
id="g1270">
</g>
<g
id="g1272">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
sodipodi:docname="arrowc_turn_right.svg"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs2375" /><sodipodi:namedview
id="namedview2373"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.0820312"
inkscape:cx="255.53791"
inkscape:cy="256"
inkscape:window-width="1296"
inkscape:window-height="776"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" />
<polygon
style="fill:#00B4D7;"
points="116.615,476.107 8.987,476.107 8.987,171.162 325.891,171.162 254.139,99.409 313.932,39.616 499.291,224.975 313.932,410.333 254.139,350.54 325.891,278.789 116.615,278.789 "
id="polygon2334" />
<path
d="M125.602,485.094H0v-322.92h304.194l-62.765-62.765l72.503-72.503L512,224.975L313.932,423.043l-72.503-72.503 l62.765-62.765H125.602V485.094z M17.974,467.12h89.654V269.802h239.959l-80.739,80.739l47.084,47.084l172.649-172.649 L313.932,52.325l-47.084,47.084l80.739,80.739H17.974V467.12z"
id="path2340" />
<g
id="g2342">
</g>
<g
id="g2344">
</g>
<g
id="g2346">
</g>
<g
id="g2348">
</g>
<g
id="g2350">
</g>
<g
id="g2352">
</g>
<g
id="g2354">
</g>
<g
id="g2356">
</g>
<g
id="g2358">
</g>
<g
id="g2360">
</g>
<g
id="g2362">
</g>
<g
id="g2364">
</g>
<g
id="g2366">
</g>
<g
id="g2368">
</g>
<g
id="g2370">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

View File

@ -1,80 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
<g>
<path style="fill:#407190;" d="M197.852,345.632c-11.929-7.769-28.97-2.745-38.061,11.215l-63.172,97.022
c-9.09,13.96-6.787,31.576,5.142,39.34c11.929,7.769,28.97,2.745,38.061-11.215l63.172-97.017
C212.084,371.015,209.781,353.4,197.852,345.632z"/>
<path style="fill:#407190;" d="M314.146,345.632c11.929-7.769,28.966-2.745,38.061,11.215l63.172,97.022
c9.09,13.96,6.787,31.576-5.142,39.34c-11.929,7.769-28.97,2.745-38.061-11.215l-63.172-97.017
C299.914,371.015,302.217,353.4,314.146,345.632z"/>
</g>
<path style="fill:#CD4E38;" d="M292.795,49.633c0,7.395-5.992,13.387-13.387,13.387h-46.824c-7.395,0-13.387-5.992-13.387-13.387
V28.525c0-7.395,5.992-13.387,13.387-13.387h46.828c7.395,0,13.387,5.992,13.387,13.387v21.108H292.795z"/>
<g>
<rect x="191.324" y="43.284" style="fill:#407190;" width="129.362" height="62.726"/>
<rect x="66.328" y="52.444" transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 235.4177 119.4317)" style="fill:#407190;" width="53.291" height="112.056"/>
</g>
<path style="fill:#CD4E38;" d="M157.892,37.955C123.061,8.882,74.036,8.245,38.784,34.78c-0.212-0.242-0.416-0.484-0.646-0.718
c-5.401-5.401-14.164-5.401-19.566,0s-5.401,14.164,0,19.566c0.229,0.229,0.472,0.438,0.714,0.646
c-26.531,35.252-25.894,84.272,3.179,119.107c0.654,0.786,1.606,1.258,2.626,1.3c1.02,0.051,2.01-0.336,2.733-1.058l130.31-130.31
c0.722-0.722,1.109-1.713,1.062-2.737C159.15,39.566,158.674,38.609,157.892,37.955z"/>
<rect x="392.371" y="52.434" transform="matrix(0.7071 0.7071 -0.7071 0.7071 199.4214 -264.5218)" style="fill:#407190;" width="53.291" height="112.056"/>
<path style="fill:#CD4E38;" d="M354.106,37.955c34.835-29.072,83.856-29.706,119.107-3.175c0.212-0.242,0.421-0.484,0.65-0.718
c5.401-5.401,14.164-5.401,19.566,0c5.401,5.401,5.401,14.164,0,19.566c-0.229,0.229-0.476,0.438-0.714,0.646
c26.527,35.252,25.894,84.272-3.179,119.107c-0.654,0.786-1.606,1.258-2.626,1.3c-1.02,0.051-2.01-0.336-2.733-1.058L353.864,43.314
c-0.722-0.722-1.109-1.713-1.062-2.737C352.848,39.566,353.32,38.609,354.106,37.955z"/>
<circle style="fill:#589BC7;" cx="256.005" cy="271.984" r="212.742"/>
<g style="opacity:0.4;">
<circle style="fill:#FBF5E2;" cx="256.005" cy="271.984" r="182.951"/>
</g>
<circle style="fill:#FBF5E2;" cx="256.005" cy="271.984" r="165.298"/>
<path style="fill:#407190;" d="M328.825,332.385c5.478,5.788,5.533,14.628,0.128,19.749l0,0c-5.41,5.117-14.237,4.573-19.715-1.211
l-53.296-56.925c-5.478-5.788-5.533-14.628-0.127-19.749l0,0c5.41-5.117,14.237-4.573,19.715,1.211L328.825,332.385z"/>
<g style="opacity:0.4;">
<path style="fill:#407190;" d="M334.213,148.367c2.036-3.655,0.714-8.27-2.945-10.306l0,0c-3.659-2.036-8.274-0.718-10.306,2.941
l-67.698,121.53c-2.036,3.659-0.714,8.274,2.945,10.31l0,0c3.659,2.036,8.274,0.718,10.306-2.941L334.213,148.367z"/>
</g>
<path style="fill:#CD4E38;" d="M116.036,215.386c-0.909,2.184,0.123,4.692,2.303,5.593l133.374,55.519
c2.18,0.909,4.687-0.123,5.593-2.303l0,0c0.905-2.184-0.123-4.692-2.308-5.593l-133.365-55.519
C119.449,212.173,116.945,213.206,116.036,215.386L116.036,215.386z"/>
<circle style="fill:#589BC7;" cx="256.005" cy="271.984" r="36.284"/>
<g>
<circle style="fill:#CD4E38;" cx="256.005" cy="131.598" r="9.456"/>
<circle style="fill:#CD4E38;" cx="256.005" cy="412.353" r="9.456"/>
<circle style="fill:#CD4E38;" cx="115.594" cy="271.984" r="9.456"/>
<circle style="fill:#CD4E38;" cx="396.374" cy="271.984" r="9.456"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="2050px"
height="2050px"
viewBox="0 0 2050 2050"
version="1.1"
id="svg3744"
sodipodi:docname="funy_angel.svg"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview3746"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="0.2702439"
inkscape:cx="1115.6588"
inkscape:cy="1047.2022"
inkscape:window-width="1296"
inkscape:window-height="776"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="svg3744" />
<defs
id="defs3724">
<style
id="style3722">.cls-1{fill:#fff;}.cls-2{fill:#ffc500;}.cls-3{fill:#ff9f1e;}.cls-4{fill:#4795ff;}.cls-5{fill:#00305f;}</style>
</defs>
<title
id="title3726" />
<g
data-name="Layer 3"
id="Layer_3"
transform="matrix(1.6961327,0,0,1.5326067,-695.0343,-544.07158)">
<circle
class="cls-2"
cx="1025"
cy="1109.1"
r="579.40002"
id="circle3731" />
<path
class="cls-3"
d="m 1025,862.9 c 189.4,0 359.4,-32.8 475.6,-84.9 C 1395.9,627.9 1221.9,529.7 1025,529.7 c -196.9,0 -370.9,98.2 -475.6,248.3 116.2,52.1 286.2,84.9 475.6,84.9 z"
id="path3733" />
<path
class="cls-4"
d="m 1038.6,361.5 c -302.2,0 -547.2,91.6 -547.2,204.6 0,113 245,204.5 547.2,204.5 302.2,0 547.2,-91.6 547.2,-204.5 0,-112.9 -245,-204.6 -547.2,-204.6 z m 0,315.6 c -209.2,0 -378.7,-49.7 -378.7,-111 0,-61.3 169.5,-111 378.7,-111 209.2,0 378.8,49.7 378.8,111 0,61.3 -169.6,111 -378.8,111 z"
id="path3735" />
<path
class="cls-5"
d="m 1023.5,1462.5 c -76.5,0 -148.6,-30.7 -202.9,-86.5 a 30.019202,30.019202 0 1 1 43,-41.9 c 42.9,44.1 99.7,68.4 159.9,68.4 60.2,0 119.3,-25.3 162.6,-71.2 a 30,30 0 1 1 43.6,41.1 285.4,285.4 0 0 1 -92.3,65.8 275.9,275.9 0 0 1 -113.9,24.3 z"
id="path3737" />
<path
class="cls-5"
d="m 825.5,1174.6 c -29.9,0 -59.2,-13.7 -86.8,-40.7 a 30.019202,30.019202 0 0 1 41.9,-43 c 16,15.7 31.2,23.7 44.9,23.7 13.7,0 28.9,-8 44.9,-23.7 a 30.019202,30.019202 0 1 1 41.9,43 c -27.6,27 -56.8,40.7 -86.8,40.7 z"
id="path3739" />
<path
class="cls-5"
d="m 1224.5,1174.6 c -30,0 -59.2,-13.7 -86.8,-40.7 a 30.019202,30.019202 0 1 1 41.9,-43 c 16,15.7 31.1,23.7 44.9,23.7 13.8,0 28.9,-8 44.9,-23.7 a 30.019202,30.019202 0 0 1 41.9,43 c -27.6,27 -56.9,40.7 -86.8,40.7 z"
id="path3741" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#5C6670;" d="M256,202.897c-29.327,0-53.103,23.776-53.103,53.103c0,29.328,23.777,53.103,53.103,53.103
c29.329,0,53.103-23.776,53.103-53.103C309.103,226.673,285.329,202.897,256,202.897z M256,295.1
c-21.594,0-39.098-17.506-39.098-39.1s17.504-39.1,39.097-39.1c21.595,0,39.1,17.506,39.1,39.1S277.595,295.1,256,295.1z"/>
<path style="fill:#C3C6C8;" d="M256,8.067C119.071,8.067,8.067,119.071,8.067,256S119.071,503.933,256,503.933
c136.931,0,247.933-111.003,247.933-247.933S392.931,8.067,256,8.067z M256,309.103c-29.327,0-53.103-23.776-53.103-53.103
c0-29.329,23.777-53.103,53.103-53.103c29.329,0,53.103,23.776,53.103,53.103C309.103,285.329,285.329,309.103,256,309.103z"/>
<path style="fill:#A4A9AD;" d="M256,170.05c-47.468,0-85.95,38.48-85.95,85.95s38.482,85.95,85.95,85.95
c47.47,0,85.951-38.481,85.951-85.95S303.47,170.05,256,170.05z M256,309.103c-29.327,0-53.103-23.776-53.103-53.103
c0-29.329,23.777-53.103,53.103-53.103c29.329,0,53.103,23.776,53.103,53.103C309.103,285.329,285.329,309.103,256,309.103z"/>
<path style="fill:#DCDDDE;" d="M387.953,46.077l-86.217,137.164c12.538,7.896,22.9,18.931,29.96,32.02l142.662-76.783
C453.993,100.724,424.122,68.862,387.953,46.077z M79.516,430.116c14.401,14.599,30.592,27.425,48.232,38.106L211.54,329.57
c-6.114-3.703-11.722-8.152-16.717-13.213L79.516,430.116z M256,341.95c-3.934,0-7.796-0.29-11.59-0.799L222.559,501.68
c10.938,1.474,22.098,2.252,33.441,2.252c9.476,0,18.826-0.55,28.026-1.587l-18.311-160.958
C262.524,341.749,259.287,341.95,256,341.95z"/>
<path d="M437.02,74.981C388.668,26.629,324.38,0,256,0S123.333,26.629,74.981,74.981C26.629,123.332,0,187.62,0,256
s26.629,132.668,74.981,181.019C123.333,485.371,187.62,512,256,512s132.668-26.629,181.02-74.981
C485.371,388.668,512,324.38,512,256S485.371,123.332,437.02,74.981z M425.611,425.611c-45.304,45.305-105.54,70.255-169.611,70.255
s-124.306-24.95-169.611-70.255C41.085,380.307,16.135,320.071,16.135,256S41.085,131.694,86.389,86.39
C131.694,41.084,191.93,16.135,256,16.135s124.307,24.95,169.611,70.256c45.305,45.304,70.256,105.54,70.256,169.611
S470.916,380.307,425.611,425.611z M256,208.834c-26.007,0-47.165,21.159-47.165,47.167c0,26.008,21.158,47.167,47.165,47.167
c26.008,0,47.167-21.159,47.167-47.167C303.167,229.993,282.008,208.834,256,208.834z M256,287.032
c-17.11,0-31.03-13.92-31.03-31.032s13.92-31.032,31.03-31.032c17.111,0,31.032,13.92,31.032,31.032S273.111,287.032,256,287.032z
M256,161.982c-51.842,0-94.018,42.176-94.018,94.018s42.176,94.018,94.018,94.018c51.842,0,94.019-42.176,94.019-94.018
S307.842,161.982,256,161.982z M256,333.883c-42.945,0-77.883-34.939-77.883-77.883s34.938-77.883,77.883-77.883
c42.946,0,77.884,34.938,77.884,77.883S298.946,333.883,256,333.883z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<rect height="1" width="24" y="1047.4" x="0" fill="#95a5a6"/>
<path d="m4 1033.4c-0.5523 0-1 0.4-1 1v1 7 1 1 2h2 14 2v-2-2-7-1c0-0.6-0.448-1-1-1h-1-13-1-1z" fill="#7f8c8d"/>
<path d="m3 1046.4-3 1h3 18 3l-3-1h-18z" fill="#bdc3c7"/>
<rect height="1" width="4" y="1047.4" x="10" fill="#7f8c8d"/>
<rect height="11" width="16" y="1034.4" x="4" fill="#34495e"/>
<path d="m20 1036.8-14.812 8.6h13.812 1v-1-7.6z" fill="#2c3e50"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 785 B

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m6 1034.4c-0.7071 0-1.4347 0.1-2.0625 0.3-2.3366 0.8-3.943 3.2-3.9375 5.7-0.005475 2.4 1.6009 4.8 3.9375 5.6 0.9747 0.4 2.1565 0.4 3.1875 0.4 1.95 0 3.172-2.1 4.875-2 1.703-0.1 2.925 2 4.875 2 1.031 0 2.213 0 3.187-0.4 2.337-0.8 3.943-3.2 3.938-5.6 0.005-2.5-1.601-4.9-3.938-5.7-0.631-0.2-1.354-0.3-2.062-0.3h-1.125-9.75-0.7812z" fill="#95a5a6"/>
<path d="m6 1033.4c-0.7071 0-1.4347 0.1-2.0625 0.3-2.3366 0.8-3.943 3.2-3.9375 5.7-0.005475 2.4 1.6009 4.8 3.9375 5.6 0.9747 0.4 2.1565 0.4 3.1875 0.4 1.95 0 3.172-2.1 4.875-2 1.703-0.1 2.925 2 4.875 2 1.031 0 2.213 0 3.187-0.4 2.337-0.8 3.943-3.2 3.938-5.6 0.005-2.5-1.601-4.9-3.938-5.7-0.631-0.2-1.354-0.3-2.062-0.3h-1.125-9.75-0.7812z" fill="#bdc3c7"/>
<path d="m11 11a4 4 0 1 1 -8 0 4 4 0 1 1 8 0z" transform="translate(-1 1028.4)" fill="#ecf0f1"/>
<path d="m6 1036.4c-0.5523 0-1 0.4-1 1v1h-1c-0.5523 0-1 0.4-1 1 0 0.5 0.4477 1 1 1h1v1c0 0.5 0.4477 1 1 1s1-0.5 1-1v-1h1c0.5523 0 1-0.5 1-1 0-0.6-0.4477-1-1-1h-1v-1c0-0.6-0.4477-1-1-1z" fill="#7f8c8d"/>
<path d="m11 11a4 4 0 1 1 -8 0 4 4 0 1 1 8 0z" transform="translate(11 1028.4)" fill="#ecf0f1"/>
<path d="m16 10a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="translate(1 1029.4)" fill="#27ae60"/>
<path d="m16 10a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="translate(3 1031.4)" fill="#f39c12"/>
<path d="m16 10a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="translate(3 1027.4)" fill="#2980b9"/>
<path d="m16 10a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="translate(5 1029.4)" fill="#c0392b"/>
<path d="m11.5 11c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5h1c0.276 0 0.5-0.224 0.5-0.5s-0.224-0.5-0.5-0.5h-1z" transform="translate(0 1028.4)" fill="#7f8c8d"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m5 1031.4c-1.1046 0-2 0.9-2 2v14c0 1.1 0.8954 2 2 2h13 1c1.105 0 2-0.9 2-2v-13l-3-3h-13z" fill="#3498db"/>
<path d="m7 1031.4v1 5c0 0.5 0.4477 1 1 1h8c0.552 0 1-0.5 1-1v-5-1h-10z" fill="#2980b9"/>
<path d="m7 3v5c0 0.5523 0.4477 1 1 1h8c0.552 0 1-0.4477 1-1v-5h-10z" transform="translate(0 1028.4)" fill="#ecf0f1"/>
<path d="m6 1040.4c-0.5523 0-1 0.4-1 1v3 2 3h4 6 4v-3-2-3c0-0.6-0.448-1-1-1h-4-4-4z" fill="#ecf0f1"/>
<g fill="#bdc3c7">
<rect height="1" width="14" y="1048.4" x="5"/>
<rect height="1" width="10" y="1042.4" x="7"/>
<rect height="1" width="10" y="1044.4" x="7"/>
</g>
<rect height="4" width="3" y="1032.4" x="13" fill="#3498db"/>
<rect height=".99998" width="3" y="1032.4" x="13" fill="#2980b9"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m19 1038.4c0.552 0 1 0.4 1 1v1c0 4-3.056 7.4-7 7.9v2.1h6c0.552 0 1 0.4 1 1 0 0.5-0.448 1-1 1h-14c-0.5523 0-1-0.5-1-1 0-0.6 0.4477-1 1-1h6v-2.1c-3.9444-0.5-7-3.9-7-7.9v-1c0-0.6 0.4477-1 1-1s1 0.4 1 1v1c0 3.3 2.6863 6 6 6 3.314 0 6-2.7 6-6v-1c0-0.6 0.448-1 1-1z" fill="#95a5a6"/>
<path d="m12 1028.4c2.209 0 4 1.8 4 4v8c0 2.2-1.791 4-4 4-2.2091 0-4-1.8-4-4v-8c0-2.2 1.7909-4 4-4z" fill="#bdc3c7"/>
<path d="m12 1028.4v16c-2.2091 0-4-1.8-4-4v-8c0-2.2 1.7909-4 4-4z" fill="#95a5a6"/>
<path d="m16 1033.4v1h-2v-1h2zm0 2v1h-2v-1h2zm0 2v1h-2v-1h2z" fill="#95a5a6"/>
<path d="m10 1033.4v1h-2v-1h2zm0 2v1h-2v-1h2zm0 2v1h-2v-1h2z" fill="#7f8c8d"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1007 B

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 306.388 306.388" style="enable-background:new 0 0 306.388 306.388;" xml:space="preserve">
<g>
<path style="fill:#CCD0D2;" d="M19.149,95.761h268.09c10.57,0,19.149,8.569,19.149,19.149v114.876
c0,10.58-8.579,19.168-19.149,19.168H19.149C8.579,248.955,0,240.376,0,229.786V114.919C0,104.33,8.569,95.761,19.149,95.761z"/>
<path style="fill:#324D5B;" d="M258.515,67.027H47.873c-10.57,0-19.149,8.579-19.149,19.149v9.584h248.94v-9.584
C277.664,75.616,269.085,67.027,258.515,67.027z M258.515,172.338H47.873c-10.57,0-19.149,8.579-19.149,19.168v57.448h248.94
v-57.448C277.664,180.917,269.085,172.338,258.515,172.338z"/>
<path style="fill:#E4E7E7;" d="M57.448,0.005v95.756H248.94V0.005H57.448z M57.448,306.383H248.94v-95.727H57.448V306.383z"/>
<path style="fill:#C2C5C5;" d="M76.597,19.164v19.149h153.194V19.164H76.597z M76.597,67.027h153.194v-19.14H76.597V67.027z"/>
<path style="fill:#C25D52;" d="M67.022,124.494c5.295,0,9.575,4.28,9.575,9.555c0,5.295-4.28,9.594-9.575,9.594
s-9.575-4.299-9.575-9.594C57.448,128.784,61.728,124.494,67.022,124.494z"/>
<path style="fill:#50626C;" d="M105.321,124.494c5.295,0,9.575,4.28,9.575,9.555c0,5.295-4.28,9.594-9.575,9.594
s-9.575-4.299-9.575-9.594C95.746,128.784,100.026,124.494,105.321,124.494z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m24 12a12 12 0 1 1 -24 0 12 12 0 1 1 24 0z" transform="matrix(.91667 0 0 .91667 1 1029.4)" fill="#bdc3c7"/>
<g fill="#95a5a6">
<path d="m6 1048.4c1.6702 1.2 3.7518 2 6 2 2.248 0 4.33-0.8 6-2h-12z"/>
<path d="m12 1c-6.0751 0-11 4.9249-11 11 0 6.075 4.9249 11 11 11v-22z" transform="translate(0 1028.4)"/>
<path d="m17 13a6 6 0 1 1 -12 0 6 6 0 1 1 12 0z" transform="translate(1 1028.4)"/>
</g>
<path d="m12 1035.4c-3.3137 0-6 2.6-6 6 0 3.3 2.6863 6 6 6v-12z" fill="#7f8c8d"/>
<path d="m17 13a6 6 0 1 1 -12 0 6 6 0 1 1 12 0z" transform="translate(1 1027.4)" fill="#ecf0f1"/>
<path d="m15 12.5a3 3.5 0 1 1 -6 0 3 3.5 0 1 1 6 0z" transform="matrix(1.3333 0 0 1.1429 -4 1026.1)" fill="#34495e"/>
<path d="m15 12.5a3 3.5 0 1 1 -6 0 3 3.5 0 1 1 6 0z" transform="matrix(1 0 0 .85714 0 1029.6)" fill="#2c3e50"/>
<path d="m14 13a2 2 0 1 1 -4 0 2 2 0 1 1 4 0z" transform="translate(0 1027.4)" fill="#34495e"/>
<path d="m13 13a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="translate(0 1027.4)" fill="#3498db"/>
<path d="m25 12.5a1.5 1.5 0 1 1 -3 0 1.5 1.5 0 1 1 3 0z" transform="matrix(.66667 0 0 .66666 -4.6667 1030)" fill="#ecf0f1"/>
<rect height="1" width="3" y="1030.4" x="9" fill="#7f8c8d"/>
<rect height="1" width="3" y="1032.4" x="9" fill="#7f8c8d"/>
<rect height="1" width="3" y="1030.4" x="12" fill="#95a5a6"/>
<rect height="1" width="3" y="1032.4" x="12" fill="#95a5a6"/>
<path d="m6 20c1.6702 1.252 3.7518 2 6 2v-2h-6z" transform="translate(0 1028.4)" fill="#7f8c8d"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 310.115 310.115" style="enable-background:new 0 0 310.115 310.115;" xml:space="preserve">
<g>
<path style="fill:#D07C40;" d="M309.691,116.824c-1.401-4.069-3.605-7.906-6.852-11.153L175.595,9.17
c-16.594-12.226-25.051-12.226-41.364,0L7.537,105.671c-3.247,3.247-5.46,7.084-6.862,11.153l154.237,135.304
C154.913,252.129,309.691,116.824,309.691,116.824z"/>
<path style="fill:#E4E7E7;" d="M39.082,29.852h231.95v193.282H39.082V29.852z"/>
<path style="fill:#E8AB54;" d="M16.351,297.203l138.523-107.905l138.88,107.915c5.132-2.619,9.346-6.678,12.158-11.704
L175.595,183.152c-16.449-12.139-25.099-12.332-41.364,0L4.116,285.345C6.919,290.428,11.152,294.555,16.351,297.203z"/>
<path style="fill:#C2C5C5;" d="M77.741,78.175v19.329h154.634V78.175H77.741z M77.741,136.152h154.634v-19.32H77.741V136.152z"/>
<path style="fill:#E8AB54;" d="M155.058,232.799l154.634-115.975v164.298c0,16.014-12.98,28.994-28.994,28.994H29.418
c-16.014,0-28.994-12.98-28.994-28.994V116.824C0.424,116.824,155.058,232.799,155.058,232.799z"/>
<path style="fill:#F4B459;" d="M283.79,309.796c6.263-0.667,11.926-3.286,16.343-7.306L154.874,189.288L9.953,302.49
c4.426,4.03,10.08,6.64,16.362,7.316L283.79,309.796z"/>
<path style="fill:#F9D7A7;" d="M4.116,295.009c2.803,5.084,7.045,9.21,12.235,11.868l138.523-107.896l138.88,107.905
c5.132-2.619,9.346-6.678,12.158-11.704L175.595,192.798c-18.256-13.521-22.683-14.139-41.364,0
C134.23,192.798,4.116,295.009,4.116,295.009z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m3 1033.4c-1.1046 0-2 0.9-2 2v3 2 2 2 3c0 1.1 0.8954 2 2 2h9 9c1.105 0 2-0.9 2-2v-7-2-3c0-1.1-0.895-2-2-2h-9-9z" fill="#7f8c8d"/>
<path d="m3 1032.4c-1.1046 0-2 0.9-2 2v3 2 2 2 3c0 1.1 0.8954 2 2 2h9 9c1.105 0 2-0.9 2-2v-7-2-3c0-1.1-0.895-2-2-2h-9-9z" fill="#bdc3c7"/>
<path d="m3 1048.4c-0.5523 0-1.0443-0.3-1.4062-0.6l10.406-10.4 10.406 10.4c-0.362 0.3-0.854 0.6-1.406 0.6h-18z" fill="#95a5a6"/>
<path d="m1.8438 5l10.156 12 10.156-12h-20.312z" transform="translate(0 1028.4)" fill="#7f8c8d"/>
<path d="m3 1032.4c-0.5523 0-1.0443 0.2-1.4062 0.6l10.406 10.4 10.406-10.4c-0.362-0.4-0.854-0.6-1.406-0.6h-18z" fill="#ecf0f1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 994 B

View File

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 55 55" style="enable-background:new 0 0 55 55;" xml:space="preserve">
<g>
<g>
<path style="fill:#3ABCA7;" d="M44.136,52H8.864C4.245,52,0.5,48.255,0.5,43.636V8.364C0.5,3.745,4.245,0,8.864,0h35.272
C48.755,0,52.5,3.745,52.5,8.364v35.272C52.5,48.255,48.755,52,44.136,52z"/>
<path style="fill:#FFFFFF;" d="M44.5,14h-18c-0.553,0-1-0.447-1-1s0.447-1,1-1h18c0.553,0,1,0.447,1,1S45.053,14,44.5,14z"/>
<path style="fill:#FFFFFF;" d="M44.5,28h-18c-0.553,0-1-0.447-1-1s0.447-1,1-1h18c0.553,0,1,0.447,1,1S45.053,28,44.5,28z"/>
<path style="fill:#FFFFFF;" d="M44.5,42h-18c-0.553,0-1-0.447-1-1s0.447-1,1-1h18c0.553,0,1,0.447,1,1S45.053,42,44.5,42z"/>
<path style="fill:#FFFFFF;" d="M12.57,17c-0.209,0-0.42-0.065-0.599-0.2L7.4,13.371c-0.442-0.331-0.532-0.958-0.2-1.399
c0.331-0.443,0.958-0.531,1.399-0.2l3.822,2.866L18.67,7.35c0.359-0.42,0.991-0.468,1.409-0.108
c0.42,0.359,0.469,0.99,0.108,1.409l-6.857,8C13.134,16.881,12.854,17,12.57,17z"/>
<path style="fill:#FFFFFF;" d="M12.57,31c-0.209,0-0.42-0.065-0.599-0.2L7.4,27.371c-0.442-0.331-0.532-0.958-0.2-1.399
c0.331-0.443,0.958-0.531,1.399-0.2l3.822,2.866l6.248-7.288c0.359-0.421,0.991-0.468,1.409-0.108
c0.42,0.359,0.469,0.99,0.108,1.409l-6.857,8C13.134,30.881,12.854,31,12.57,31z"/>
<path style="fill:#FFFFFF;" d="M12.57,45.999c-0.209,0-0.42-0.065-0.599-0.2L7.4,42.37c-0.442-0.331-0.532-0.958-0.2-1.399
c0.331-0.443,0.958-0.531,1.399-0.2l3.822,2.866l6.248-7.287c0.359-0.42,0.991-0.468,1.409-0.108
c0.42,0.359,0.469,0.99,0.108,1.409l-6.857,7.999C13.134,45.88,12.854,45.999,12.57,45.999z"/>
</g>
<g>
<path style="fill:#D0E8F9;" d="M44.5,42h-2l0,0c-3.633-1.453-6-4.861-6-8.64V30h14v3.36C50.5,37.139,48.133,40.547,44.5,42
L44.5,42z"/>
<path style="fill:#D0E8F9;" d="M42.5,42h2l0,0c3.633,1.453,6,4.861,6,8.64V54h-14v-3.36C36.5,46.861,38.867,43.453,42.5,42
L42.5,42z"/>
<g>
<path style="fill:#556080;" d="M33.5,31h1h2h17c0.553,0,1-0.448,1-1s-0.447-1-1-1h-17h-2h-1c-0.553,0-1,0.448-1,1
S32.947,31,33.5,31z"/>
<path style="fill:#556080;" d="M53.499,52.998h-18c-0.003,0-0.006,0.002-0.01,0.002H33.5c-0.553,0-1,0.448-1,1s0.447,1,1,1h3
c0.003,0,0.006-0.002,0.01-0.002h16.989c0.553,0,1-0.448,1-1S54.052,52.998,53.499,52.998z"/>
</g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m21 1034.4 2 10h-2v-10z" fill="#f39c12"/>
<path d="m3 1034.4-2 10h2v-10z" fill="#f39c12"/>
<path d="m3 1037.4-2 14h2 18 2l-2-14h-18z" fill="#e67e22"/>
<path d="m1 1044.4v7h22v-7h-8.188c-0.415 1.1-1.511 2-2.812 2s-2.397-0.9-2.8125-2h-8.1875z" fill="#f1c40f"/>
<rect height="3" width="18" y="1034.4" x="3" fill="#f39c12"/>
<rect height="1" width="22" y="1051.4" x="1" fill="#f39c12"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 754 B

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<polyline style="fill:#FDBB00;" points="402.026,439.864 402.026,32.094 175.298,32.094 175.298,439.864 "/>
<polyline style="fill:#EDAB06;" points="221.087,439.864 221.087,32.094 175.298,32.094 175.298,439.864 "/>
<polyline style="fill:#F9CF67;" points="369.877,439.864 369.877,32.094 338.962,32.094 338.962,439.864 "/>
<rect x="8.92" y="220.749" style="fill:#FDBB00;" width="226.728" height="244.664"/>
<rect x="8.92" y="220.749" style="fill:#EDAB06;" width="48.608" height="244.664"/>
<rect x="165.813" y="220.749" style="fill:#F9CF67;" width="33.841" height="244.664"/>
<path style="fill:#FDBB00;" d="M503.993,368.802c0,62.607-50.763,113.358-113.37,113.358c-14.518,0-28.393-2.73-41.152-7.705
c-42.257-16.47-72.207-57.565-72.207-105.654c0-62.618,50.751-113.37,113.358-113.37c14.462,0,28.28,2.707,40.994,7.648
C473.964,279.505,503.993,320.646,503.993,368.802z"/>
<path style="fill:#F9CF67;" d="M503.993,368.802c0,62.607-50.763,113.358-113.37,113.358c-14.518,0-28.393-2.73-41.152-7.705
l82.145-211.375C473.964,279.505,503.993,320.646,503.993,368.802z"/>
<path d="M273.669,430.276h-5.873c-4.674,0-8.46,3.788-8.46,8.46c0,4.672,3.787,8.46,8.46,8.46h5.873c4.674,0,8.46-3.788,8.46-8.46
C282.129,434.064,278.341,430.276,273.669,430.276z"/>
<path d="M174.839,202.532c4.464,0,8.111-3.459,8.429-7.841h209.839v35.079c0,4.672,3.787,8.46,8.46,8.46
c4.674,0,8.46-3.788,8.46-8.46V30.966c0-4.672-3.787-8.46-8.46-8.46H174.839c-4.674,0-8.46,3.788-8.46,8.46v163.106
C166.378,198.744,170.166,202.532,174.839,202.532z M183.299,177.769v-33.501h209.807v33.501H183.299z M393.106,39.427v37.5h-54.604
c-4.674,0-8.46,3.788-8.46,8.46c0,4.672,3.787,8.46,8.46,8.46h54.604v33.501H183.299V93.848h127.002c4.674,0,8.46-3.788,8.46-8.46
c0-4.672-3.787-8.46-8.46-8.46H183.299v-37.5H393.106z"/>
<path d="M235.188,211.157H8.46c-4.674,0-8.46,3.788-8.46,8.46v244.663c0,4.672,3.787,8.46,8.46,8.46h226.728
c4.674,0,8.46-3.788,8.46-8.46V219.618C243.649,214.945,239.862,211.157,235.188,211.157z M226.728,308.279H16.921v-33.501h209.807
V308.279z M226.728,325.199V358.7H16.921v-33.501H226.728z M226.728,228.078v29.778H16.921v-29.778H226.728z M16.921,455.82v-29.778
h34.958c4.674,0,8.46-3.788,8.46-8.46s-3.787-8.46-8.46-8.46H16.921V375.62h209.807v33.501H80.081c-4.674,0-8.46,3.788-8.46,8.46
c0,4.672,3.787,8.46,8.46,8.46h146.647v29.778L16.921,455.82L16.921,455.82z"/>
<path d="M264.412,228.191c-4.674,0-8.46,3.788-8.46,8.46s3.787,8.46,8.46,8.46h91.367c4.674,0,8.46-3.788,8.46-8.46
s-3.787-8.46-8.46-8.46H264.412z"/>
<path d="M279.64,295.534c4.674,0,8.46-3.788,8.46-8.46c0-4.672-3.787-8.46-8.46-8.46h-15.228c-4.674,0-8.46,3.788-8.46,8.46
c0,4.672,3.787,8.46,8.46,8.46H279.64z"/>
<path d="M390.176,245.845c-67.175,0-121.824,54.65-121.824,121.824s54.65,121.824,121.824,121.824S512,434.844,512,367.67
S457.35,245.845,390.176,245.845z M390.176,472.573c-57.843,0-104.904-47.059-104.904-104.904s47.06-104.904,104.904-104.904
s104.904,47.059,104.904,104.904S448.019,472.573,390.176,472.573z"/>
<path d="M465.17,359.209c-4.674,0-8.46,3.788-8.46,8.46c0,37.653-29.847,68.287-66.534,68.287
c-36.686,0-66.533-30.633-66.533-68.287s29.847-68.287,66.533-68.287c26.771,0,50.827,16.347,61.282,41.644
c1.785,4.318,6.73,6.372,11.052,4.587c4.317-1.785,6.371-6.732,4.587-11.05c-13.083-31.651-43.275-52.103-76.92-52.103
c-46.017,0-83.454,38.224-83.454,85.208s37.438,85.208,83.454,85.208c46.018,0,83.455-38.224,83.455-85.208
C473.63,362.997,469.843,359.209,465.17,359.209z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<circle style="fill:#FBB500;" cx="256" cy="256" r="256"/>
<g>
<circle style="fill:#FFCE47;" cx="256" cy="256" r="227.788"/>
<path style="fill:#FFCE47;" d="M256,0C114.615,0,0,114.615,0,256s114.615,256,256,256V0z"/>
</g>
<path style="fill:#FFE29E;" d="M256,28.212C130.196,28.212,28.212,130.196,28.212,256S130.196,483.788,256,483.788V28.212z"/>
<g>
<path style="fill:#FBB500;" d="M256,457.317c-111.007,0-201.317-90.311-201.317-201.317S144.993,54.683,256,54.683
S457.317,144.993,457.317,256S367.007,457.317,256,457.317z M256,86.03c-93.722,0-169.97,76.248-169.97,169.97
S162.278,425.97,256,425.97S425.97,349.722,425.97,256S349.722,86.03,256,86.03z"/>
<path style="fill:#FBB500;" d="M259.486,173.801h64.296v-31.347h-64.296c-40.276,0-73.905,28.925-81.252,67.088h-27.63v31.347
h26.122v30.223h-26.122v31.347h27.63c7.348,38.163,40.978,67.088,81.252,67.088h64.296v-31.347h-64.296
c-22.885,0-42.318-15.033-48.963-35.741h81.912v-31.347h-84.363v-30.223h84.363v-31.347h-81.912
C217.167,188.834,236.6,173.801,259.486,173.801z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m20.828 1031.5c-1.554-1.5-4.07-1.5-5.634 0h-0.022l-2.122 2.2-1.436 1.4-6.6955 6.7c-2.1479 2.1-2.1479 5.6 0 7.8 2.1479 2.1 5.6305 2.1 7.7785 0l8.131-8.2-1.414-1.4-6.364 6.4-1.414 1.4-0.243 0.2c-0.037 0.1-0.072 0.1-0.111 0.2-1.4327 1.3-3.6178 1.3-4.9493 0-1.3314-1.4-1.3226-3.6 0-5l0.1105-0.1 0.2431-0.3 1.4142-1.4 4.9275-4.9 1.127-1.1 0.309-0.3 2.122-2.2h0.022c0.783-0.7 2.033-0.7 2.806 0 0.774 0.8 0.781 2.1 0.022 2.9h-0.022l-2.43 2.4-1.812 1.8-0.708 0.7-1.48 1.5-1.702 1.7c-0.195 0.2-0.511 0.2-0.707 0-0.195-0.2-0.195-0.5 0-0.7l1.702-1.7 1.48-1.5 0.707-0.7 2.122-2.1-1.414-1.4-2.122 2.1-0.707 0.7-3.1818 3.2h-0.0222c-0.9656 1-0.9541 2.5 0.0222 3.5 0.9758 1 2.5478 1 3.5138 0h0.022l1.06-1 2.829-2.9 4.242-4.2h0.022c1.541-1.6 1.533-4.1-0.022-5.7z" fill="#95a5a6"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<rect height="5.9999" width="3" y="1031.4" x="17" fill="#c0392b"/>
<path d="m12 3.0312l-9 8.9688v1.812 5.376 1.812h1 8 8 1v-1.812-5.376-1.812l-9-8.9688z" transform="translate(0 1028.4)" fill="#bdc3c7"/>
<path fill="#95a5a6" d="m12 1032-9 8.9v1.9 0.1l9-9 9 9v-0.1-1.9l-9-8.9z"/>
<g>
<path d="m12 1029.4-11.314 11.3 1.4145 1.4 9.8995-9.9 9.899 9.9 1.415-1.4-11.314-11.3z" fill="#e74c3c"/>
<path d="m14 9a2 2 0 1 1 -4 0 2 2 0 1 1 4 0z" transform="translate(0 1029.4)" fill="#3498db"/>
<rect height="6" width="4" y="1043.4" x="10" fill="#e67e22"/>
<path d="m12 17.5a0.5 0.5 0 1 1 -1 0 0.5 0.5 0 1 1 1 0z" transform="translate(1.5 1029.4)" fill="#d35400"/>
<path d="m12 1036.4c-1.105 0-2 0.9-2 2 0 0.1 0.021 0.3 0.062 0.5 0.222-0.9 1.006-1.5 1.938-1.5s1.716 0.6 1.938 1.5c0.041-0.2 0.062-0.4 0.062-0.5 0-1.1-0.895-2-2-2z" fill="#2980b9"/>
<path d="m12 17.5a0.5 0.5 0 1 1 -1 0 0.5 0.5 0 1 1 1 0z" transform="translate(1.5 1028.9)" fill="#f1c40f"/>
<rect height="1" width="4" y="1042.4" x="10" fill="#d35400"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<g transform="matrix(.70711 .70711 -.70711 .70711 740.06 298.16)">
<path d="m10.541 1028.9c-3.3134 0-5.9997 2.6-5.9997 6 0 3.3 2.6863 6 5.9997 6 3.314 0 6-2.7 6-6 0-3.4-2.686-6-6-6zm0 2c1.105 0 2 0.9 2 2s-0.895 2-2 2c-1.1042 0-1.9997-0.9-1.9997-2s0.8955-2 1.9997-2z" fill="#f39c12"/>
<g fill="#f1c40f">
<path d="m10 0c-3.3137 0-6 2.6863-6 6s2.6863 6 6 6c3.314 0 6-2.6863 6-6s-2.686-6-6-6zm0 2c1.105 0 2 0.8954 2 2s-0.895 2-2 2c-1.1046 0-2-0.8954-2-2s0.8954-2 2-2z" transform="translate(0 1028.4)"/>
<rect height="2" width="6" y="1039.4" x="7"/>
<path d="m8 13v9l2 2 2-2v-1l-2-1 2-1v-1l-1-1 1-1v-3z" transform="translate(0 1028.4)"/>
</g>
<path d="m11 1041.4v4l1-1v-3h-1zm0 4v2.5l1-0.5v-1l-1-1zm0 3.5v2.5l1-1v-1l-1-0.5z" fill="#f39c12"/>
<path d="m9 1041.4v10l1 1v-4-7h-1z" fill="#f39c12"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<rect transform="rotate(-45)" height="10" width="4" y="747.57" x="-729.04" fill="#95a5a6"/>
<rect transform="rotate(-45)" height="3" width="4" y="747.57" x="-729.04" fill="#7f8c8d"/>
<path d="m3.201 1031.4c-3.5147 3.5-3.5147 9.2 0 12.7 3.5148 3.5 9.213 3.5 12.728 0s3.515-9.2 0-12.7-9.2133-3.5-12.728 0zm2.1213 2.1c2.3432-2.3 6.1417-2.3 8.4857 0 2.343 2.4 2.343 6.2 0 8.5-2.344 2.3-6.1425 2.3-8.4857 0-2.3431-2.3-2.3431-6.1 0-8.5z" fill="#bdc3c7"/>
<path d="m16 9.5a6.5 6.5 0 1 1 -13 0 6.5 6.5 0 1 1 13 0z" transform="translate(0 1028.4)" fill="#ecf0f1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 914 B

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<g transform="matrix(1.0607 1.0607 -1.0607 1.0607 1146.8 34.926)">
<path d="m-63 1003.4v11.3 0.7 1l2 2 2-2v-1-0.7-11.3h-4z" fill="#ecf0f1"/>
<path d="m-61 1003.4v15l2-2v-1-0.7-11.3h-2z" fill="#bdc3c7"/>
<rect height="11" width="4" y="1004.4" x="-63" fill="#e67e22"/>
<path d="m-61 1000.4c-1.105 0-2 0.9-2 2v1h4v-1c0-1.1-0.895-2-2-2z" fill="#7f8c8d"/>
<g transform="translate(-7,1)">
<path d="m-55.406 1016 1.406 1.4 1.406-1.4h-1.406-1.406z" fill="#34495e"/>
<path d="m-54 1016v1.4l1.406-1.4h-1.406z" fill="#2c3e50"/>
</g>
<path d="m-61 1000.4c-1.105 0-2 0.9-2 2v1h2v-3z" fill="#95a5a6"/>
<rect height="11" width="2" y="1004.4" x="-61" fill="#d35400"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m12 1028.4 4 9 8 1-6 5 2 9-8-5-8 5 2-9-6-5 8-1z" fill="#f39c12"/>
<path d="m12 1028.4-4 9-6.9688 0.8 4.9688 4.2-0.1875 0.8 0.1875 0.2-1.75 7.8 7.75-4.8 7.75 4.8-1.75-7.8 0.188-0.2-0.188-0.8 4.969-4.2-6.969-0.8-4-9z" fill="#f1c40f"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 596 B

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<g transform="matrix(.70711 .70711 -.70711 .70711 737.68 297.72)">
<path d="m11 1028.4v13h1 6.406c-0.595-1.1-1.416-2.1-2.406-2.8v-8c0.616-0.6 1.131-1.4 1.531-2.2h-5.531-1z" fill="#c0392b"/>
<path d="m11 13v2 4 2l1 2v-2-6-2h-1z" transform="translate(0 1028.4)" fill="#bdc3c7"/>
<path d="m12 13v2 4 2 2l1-2v-2-4-2h-1z" transform="translate(0 1028.4)" fill="#7f8c8d"/>
<path d="m6.4688 1028.4c0.4006 0.8 0.915 1.6 1.5312 2.2v8c-0.9897 0.7-1.8113 1.7-2.4062 2.8h6.4062v-13h-5.5312z" fill="#e74c3c"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 867 B

View File

@ -1,12 +0,0 @@
<svg width="48" height="48" xmlns="http://www.w3.org/2000/svg">
<title>70 Basic icons by Xicons.co</title>
<g>
<title>Layer 1</title>
<g transform="rotate(180 24.8913 22.9976)" id="svg_4">
<rect id="svg_1" fill="#38b1e7" ry="2" rx="2" height="26" width="16" y="16" x="1.78"/>
<path id="svg_2" fill="#fac591" d="m32.44,16.17l11.56,0a4,4 0 0 1 3.9,4.9l-3.66,15.83a4,4 0 0 1 -3.9,3.1l-15.34,0a3,3 0 0 1 -0.9,-0.14l-6.36,-2l0,-17.31l1.38,-0.35a1,1 0 0 0 0.56,-0.45l4.61,-7.92a1,1 0 0 0 0.13,-0.52c0,-1 -0.11,-4.43 0.31,-5.58c0.49,-1.36 5,-3.82 7.7,1.72s0,8.51 0,8.51l0.01,0.21z"/>
<circle id="svg_3" fill="#fff" r="2" cy="36" cx="11.78"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 670 B

View File

@ -1 +0,0 @@
<svg width="48px" height="48px" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg"><title>70 Basic icons by Xicons.co</title><rect x="1.78" y="16" width="16" height="26" rx="2" ry="2" fill="#38b1e7"/><path d="M32.44,16.17H44a4,4,0,0,1,3.9,4.9L44.24,36.9a4,4,0,0,1-3.9,3.1H25a3,3,0,0,1-.9-0.14l-6.36-2V20.55l1.38-.35a1,1,0,0,0,.56-0.45l4.61-7.92a1,1,0,0,0,.13-0.52c0-1-.11-4.43.31-5.58,0.49-1.36,5-3.82,7.7,1.72s0,8.51,0,8.51Z" fill="#fac591"/><circle cx="11.78" cy="36" r="2" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 499 B

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m22 12c0 5.523-4.477 10-10 10-5.5228 0-10-4.477-10-10 0-5.5228 4.4772-10 10-10 5.523 0 10 4.4772 10 10z" transform="translate(0 1029.4)" fill="#c0392b"/>
<path d="m22 12c0 5.523-4.477 10-10 10-5.5228 0-10-4.477-10-10 0-5.5228 4.4772-10 10-10 5.523 0 10 4.4772 10 10z" transform="translate(0 1028.4)" fill="#e74c3c"/>
<path d="m7.0503 1037.8 3.5357 3.6-3.5357 3.5 1.4142 1.4 3.5355-3.5 3.536 3.5 1.414-1.4-3.536-3.5 3.536-3.6-1.414-1.4-3.536 3.5-3.5355-3.5-1.4142 1.4z" fill="#c0392b"/>
<path d="m7.0503 1036.8 3.5357 3.6-3.5357 3.5 1.4142 1.4 3.5355-3.5 3.536 3.5 1.414-1.4-3.536-3.5 3.536-3.6-1.414-1.4-3.536 3.5-3.5355-3.5-1.4142 1.4z" fill="#ecf0f1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1022 B

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1028.4)">
<path d="m22 12c0 5.523-4.477 10-10 10-5.5228 0-10-4.477-10-10 0-5.5228 4.4772-10 10-10 5.523 0 10 4.4772 10 10z" transform="translate(0 1029.4)" fill="#27ae60"/>
<path d="m22 12c0 5.523-4.477 10-10 10-5.5228 0-10-4.477-10-10 0-5.5228 4.4772-10 10-10 5.523 0 10 4.4772 10 10z" transform="translate(0 1028.4)" fill="#2ecc71"/>
<path d="m16 1037.4-6 6-2.5-2.5-2.125 2.1 2.5 2.5 2 2 0.125 0.1 8.125-8.1-2.125-2.1z" fill="#27ae60"/>
<path d="m16 1036.4-6 6-2.5-2.5-2.125 2.1 2.5 2.5 2 2 0.125 0.1 8.125-8.1-2.125-2.1z" fill="#ecf0f1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 890 B

View File

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#B4E5EA;" d="M382.455,134.029V8.258h-252.91v125.771c0,58.255,39.394,107.3,92.992,121.971
c-53.599,14.671-92.992,63.716-92.992,121.971v125.771h252.909V377.971c0-58.255-39.394-107.3-92.992-121.971
C343.061,241.329,382.455,192.283,382.455,134.029z"/>
<path style="fill:#609399;" d="M264.257,335.581V227.232c6.785-0.628,12.05-1.937,16.483-3.093
c31.425-8.191,55.375-32.565,64.576-62.651l-178.634-0.002c9.201,30.087,33.15,54.461,64.576,62.653
c4.433,1.155,9.698,2.464,16.483,3.093v108.349c-47.724,4.184-85.164,44.228-85.164,93.039v42.09h186.845v-42.09
C349.423,379.809,311.982,339.764,264.257,335.581z"/>
<path d="M393.466,495.484h-2.753V377.971c0-52.745-30.923-100.094-77.465-121.971c46.542-21.876,77.465-69.226,77.465-121.971
V16.516h2.753c4.561,0,8.258-3.696,8.258-8.258S398.027,0,393.466,0H118.534c-4.561,0-8.258,3.696-8.258,8.258
s3.697,8.258,8.258,8.258h2.753v117.513c0,52.745,30.923,100.094,77.465,121.971c-46.542,21.876-77.465,69.226-77.465,121.971
v117.513h-2.753c-4.561,0-8.258,3.696-8.258,8.258s3.697,8.258,8.258,8.258h274.931c4.561,0,8.258-3.696,8.258-8.258
S398.027,495.484,393.466,495.484z M137.803,377.971c0-53.117,35.741-99.999,86.916-114.005c3.59-0.983,6.078-4.244,6.078-7.965
c0-3.722-2.488-6.983-6.078-7.965c-51.175-14.007-86.916-60.888-86.916-114.005V16.516h236.393v117.513
c0,53.117-35.741,99.999-86.914,114.005c-3.59,0.983-6.078,4.244-6.078,7.965c0,3.722,2.488,6.983,6.078,7.965
c51.174,14.007,86.914,60.888,86.914,114.005v117.513H137.803V377.971z"/>
<path d="M282.921,339.353c-4.4-1.2-8.942,1.387-10.145,5.785c-1.205,4.4,1.386,8.942,5.785,10.146
c36.861,10.089,62.604,43.869,62.604,82.145v25.023h-170.33v-25.023c0-38.278,25.743-72.055,62.603-82.145
c4.399-1.205,6.99-5.746,5.785-10.146c-1.203-4.398-5.745-6.982-10.145-5.785c-44.018,12.048-74.759,52.379-74.759,98.076v33.281
c0,4.562,3.697,8.258,8.258,8.258h186.845c4.561,0,8.258-3.696,8.258-8.258v-33.281
C357.681,391.732,326.938,351.402,282.921,339.353z"/>
<path d="M247.742,298.851c0,4.562,3.697,8.258,8.258,8.258c4.561,0,8.258-3.696,8.258-8.258v-63.322
c7.361-0.617,13.184-1.994,18.566-3.397c33.194-8.652,60.166-34.796,70.39-68.228c0.766-2.503,0.298-5.222-1.259-7.327
c-1.558-2.104-4.02-3.346-6.638-3.346l-73.902-0.001c-4.561,0-8.258,3.697-8.258,8.258c0,4.561,3.697,8.258,8.258,8.258
l61.939,0.001c-10.486,22.798-30.64,40.132-54.696,46.404c-5.182,1.351-12.278,3.201-22.658,3.201
c-10.379,0-17.475-1.851-22.658-3.202c-24.057-6.27-44.21-23.605-54.696-46.405l61.939,0.001c4.561,0,8.258-3.697,8.258-8.258
c0-4.561-3.697-8.258-8.258-8.258l-73.902-0.001c-2.617,0-5.081,1.242-6.638,3.346c-1.558,2.104-2.025,4.823-1.26,7.327
c10.223,33.433,37.195,59.577,70.39,68.23c5.383,1.403,11.207,2.78,18.566,3.397v63.322H247.742z"/>
<path d="M256,323.625c-4.561,0-8.258,3.696-8.258,8.258v2.665c0,4.562,3.697,8.258,8.258,8.258c4.561,0,8.258-3.696,8.258-8.258
v-2.665C264.258,327.321,260.561,323.625,256,323.625z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -60,7 +60,7 @@
"cypress-image-snapshot": "^4.0.1",
"eslint": "^8.4.1",
"eslint-config-airbnb-base": "^14.2.1",
"eslint-config-standard": "^16.0.3",
"eslint-config-standard": "^17.0.0",
"eslint-nibble": "^8.0.0",
"eslint-plugin-cypress": "^2.12.1",
"eslint-plugin-import": "^2.25.4",
@ -73,10 +73,9 @@
"ts-jest": "^27.1.2",
"ts-loader": "^9.2.6",
"ts-node": "^10.4.0",
"webpack": "^5.74.0",
"webpack": "^5.75.0",
"webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^3.11.2",
"webpack-merge": "^5.8.0"
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.11.1"
}
}

View File

@ -21,11 +21,12 @@ import { $assert } from '@wisemapping/core-js';
import Point from '@wisemapping/web2d';
import { Mindmap } from '..';
import CommandContext from './CommandContext';
import ControlPoint from './ControlPoint';
import RelationshipControlPoints, { PivotType } from './RelationshipControlPoints';
import Events from './Events';
import NodeModel from './model/NodeModel';
import RelationshipModel from './model/RelationshipModel';
import Topic from './Topic';
import PositionType from './PositionType';
abstract class ActionDispatcher extends Events {
private static _instance: ActionDispatcher;
@ -48,11 +49,20 @@ abstract class ActionDispatcher extends Events {
abstract deleteEntities(topicsIds: number[], relIds: number[]): void;
abstract dragTopic(topicId: number, position: Point, order: number, parentTopic: Topic): void;
abstract dragTopic(
topicId: number,
position: Point,
order: number | null,
parentTopic: Topic | null,
): void;
abstract moveTopic(topicId: number, position: Point): void;
abstract moveControlPoint(ctrlPoint: ControlPoint, point: Point): void;
abstract moveControlPoint(
model: RelationshipModel,
ctrlPoint: PositionType,
index: PivotType,
): void;
abstract changeFontFamilyToTopic(topicIds: number[], fontFamily: string): void;

View File

@ -53,7 +53,6 @@ class CentralTopic extends Topic {
this.setPosition(zeroPoint);
}
/** */
getShrinkConnector() {
return null;
}

View File

@ -46,11 +46,11 @@ abstract class Command {
return this._uuid;
}
get discardDuplicated(): string {
getDiscardDuplicated(): string {
return this._discardDuplicated;
}
set discardDuplicated(value: string) {
setDiscardDuplicated(value: string) {
this._discardDuplicated = value;
}
}

View File

@ -55,51 +55,45 @@ class CommandContext {
}
/** */
deleteTopic(topic: Topic) {
deleteTopic(topic: Topic): void {
this._designer.removeTopic(topic);
}
/** */
createTopic(model: NodeModel) {
createTopic(model: NodeModel): Topic {
$assert(model, 'model can not be null');
return this._designer.nodeModelToTopic(model);
}
// /** */
// createModel() {
// const mindmap = this._designer.getMindmap();
// return mindmap.createNode('MainTopic');
// }
/** */
addTopic(topic: Topic) {
addTopic(topic: Topic): void {
const mindmap = this._designer.getMindmap();
return mindmap.addBranch(topic.getModel());
mindmap.addBranch(topic.getModel());
}
/** */
connect(childTopic: Topic, parentTopic: Topic) {
connect(childTopic: Topic, parentTopic: Topic): void {
childTopic.connectTo(parentTopic, this._designer.getWorkSpace());
}
/** */
disconnect(topic: Topic) {
disconnect(topic: Topic): void {
topic.disconnect(this._designer.getWorkSpace());
}
/** */
addRelationship(model: RelationshipModel) {
addRelationship(model: RelationshipModel): Relationship {
$assert(model, 'model cannot be null');
return this._designer.addRelationship(model);
}
/** */
deleteRelationship(relationship: Relationship) {
deleteRelationship(relationship: Relationship): void {
this._designer.deleteRelationship(relationship);
}
/** */
findRelationships(relationshipIds: number[]) {
findRelationships(relationshipIds: number[]): Relationship[] {
$assert($defined(relationshipIds), 'relId can not be null');
const relIds = Array.isArray(relationshipIds) ? relationshipIds : [relationshipIds];
@ -108,7 +102,7 @@ class CommandContext {
}
/** */
moveTopic(topic: Topic, position: Point) {
moveTopic(topic: Topic, position: Point): void {
$assert(topic, 'topic cannot be null');
$assert(position, 'position cannot be null');
EventBus.instance.fireEvent('topicMoved', {

View File

@ -1,251 +0,0 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.
*/
import { Elipse, Line, Point } from '@wisemapping/web2d';
import { $defined } from '@wisemapping/core-js';
import Shape from './util/Shape';
import ActionDispatcher from './ActionDispatcher';
import Workspace from './Workspace';
class ControlPoint {
private control1: Elipse;
private control2: Elipse;
private _controlPointsController: Elipse[];
private _controlLines: Line[];
private _isBinded: boolean;
_line: Line;
private _workspace: Workspace;
private _endPoint: any[];
private _orignalCtrlPoint: any;
private _controls: any;
private _mouseMoveFunction: (e: Event) => void;
private _mouseUpFunction: (e: Event) => void;
constructor() {
this.control1 = new Elipse({
width: 6,
height: 6,
stroke: '1 solid #6589de',
fillColor: 'gray',
visibility: false,
});
this.control1.setCursor('pointer');
this.control2 = new Elipse({
width: 6,
height: 6,
stroke: '1 solid #6589de',
fillColor: 'gray',
visibility: false,
});
this.control2.setCursor('pointer');
this._controlPointsController = [this.control1, this.control2];
this._controlLines = [
new Line({ strokeColor: '#6589de', strokeWidth: 1, opacity: 0.3 }),
new Line({ strokeColor: '#6589de', strokeWidth: 1, opacity: 0.3 }),
];
this._isBinded = false;
const me = this;
this._controlPointsController[0].addEvent('mousedown', (event) => {
me._mouseDown(event, ControlPoint.FROM, me);
});
this._controlPointsController[0].addEvent('click', (event) => {
me._mouseClick(event);
});
this._controlPointsController[0].addEvent('dblclick', (event) => {
me._mouseClick(event);
});
this._controlPointsController[1].addEvent('mousedown', (event) => {
me._mouseDown(event, ControlPoint.TO, me);
});
this._controlPointsController[1].addEvent('click', (event) => {
me._mouseClick(event);
});
this._controlPointsController[1].addEvent('dblclick', (event) => {
me._mouseClick(event);
});
}
setLine(line: Line) {
if ($defined(this._line)) {
this._removeLine();
}
this._line = line;
this._createControlPoint();
this._endPoint = [];
this._orignalCtrlPoint = [];
this._orignalCtrlPoint[0] = { ...this._controls[0] };
this._orignalCtrlPoint[1] = { ...this._controls[1] };
this._endPoint[0] = { ...this._line.getLine().getFrom() };
this._endPoint[1] = { ...this._line.getLine().getTo() };
}
setControlPointTestId(ctrlPoint1, ctrlPoint2) {
this.control1.setTestId(ctrlPoint1);
this.control2.setTestId(ctrlPoint2);
}
redraw() {
if ($defined(this._line)) this._createControlPoint();
}
private _createControlPoint() {
this._controls = this._line.getLine().getControlPoints();
let pos = this._line.getLine().getFrom();
this._controlPointsController[0].setPosition(
this._controls[ControlPoint.FROM].x + pos.x,
this._controls[ControlPoint.FROM].y + pos.y - 3,
);
this._controlLines[0].setFrom(pos.x, pos.y);
this._controlLines[0].setTo(
this._controls[ControlPoint.FROM].x + pos.x + 3,
this._controls[ControlPoint.FROM].y + pos.y,
);
pos = this._line.getLine().getTo();
this._controlLines[1].setFrom(pos.x, pos.y);
this._controlLines[1].setTo(
this._controls[ControlPoint.TO].x + pos.x + 3,
this._controls[ControlPoint.TO].y + pos.y,
);
this._controlPointsController[1].setPosition(
this._controls[ControlPoint.TO].x + pos.x,
this._controls[ControlPoint.TO].y + pos.y - 3,
);
}
private _removeLine() {
// Overwrite default behaviour ...
}
private _mouseDown(event: Event, point, me) {
if (!this._isBinded) {
this._isBinded = true;
this._mouseMoveFunction = (e) => {
me._mouseMoveEvent(e, point, me);
};
this._workspace.getScreenManager().addEvent('mousemove', this._mouseMoveFunction);
this._mouseUpFunction = (e: Event) => {
me._mouseUp(e, point, me);
};
this._workspace.getScreenManager().addEvent('mouseup', this._mouseUpFunction);
}
event.preventDefault();
event.stopPropagation();
return false;
}
private _mouseMoveEvent(event: MouseEvent, point: Point) {
const screen = this._workspace.getScreenManager();
const pos = screen.getWorkspaceMousePosition(event);
let cords;
if (point === 0) {
cords = Shape.calculateRelationShipPointCoordinates(this._line.getSourceTopic(), pos);
this._line.setFrom(cords.x, cords.y);
this._line.setSrcControlPoint(new Point(pos.x - cords.x, pos.y - cords.y));
} else {
cords = Shape.calculateRelationShipPointCoordinates(this._line.getTargetTopic(), pos);
this._line.setTo(cords.x, cords.y);
this._line.setDestControlPoint(new Point(pos.x - cords.x, pos.y - cords.y));
}
this._controls[point].x = pos.x - cords.x;
this._controls[point].y = pos.y - cords.y;
this._controlPointsController[point].setPosition(pos.x - 5, pos.y - 3);
this._controlLines[point].setFrom(cords.x, cords.y);
this._controlLines[point].setTo(pos.x - 2, pos.y);
this._line.getLine().updateLine(point);
}
private _mouseUp(event: MouseEvent, point: Point) {
this._workspace.getScreenManager().removeEvent('mousemove', this._mouseMoveFunction);
this._workspace.getScreenManager().removeEvent('mouseup', this._mouseUpFunction);
const actionDispatcher = ActionDispatcher.getInstance();
actionDispatcher.moveControlPoint(this, point);
this._isBinded = false;
}
_mouseClick(event: MouseEvent) {
event.preventDefault();
event.stopPropagation();
return false;
}
setVisibility(visible: boolean) {
if (visible) {
this._controlLines[0].moveToFront();
this._controlLines[1].moveToFront();
this._controlPointsController[0].moveToFront();
this._controlPointsController[1].moveToFront();
}
this._controlPointsController[0].setVisibility(visible);
this._controlPointsController[1].setVisibility(visible);
this._controlLines[0].setVisibility(visible);
this._controlLines[1].setVisibility(visible);
}
addToWorkspace(workspace: Workspace): void {
this._workspace = workspace;
workspace.append(this._controlPointsController[0]);
workspace.append(this._controlPointsController[1]);
workspace.append(this._controlLines[0]);
workspace.append(this._controlLines[1]);
}
removeFromWorkspace(workspace: Workspace) {
this._workspace = null;
workspace.removeChild(this._controlPointsController[0]);
workspace.removeChild(this._controlPointsController[1]);
workspace.removeChild(this._controlLines[0]);
workspace.removeChild(this._controlLines[1]);
}
getControlPoint(index: number): ControlPoint {
return this._controls[index];
}
getOriginalEndPoint(index: number) {
return this._endPoint[index];
}
getOriginalCtrlPoint(index: number): ControlPoint {
return this._orignalCtrlPoint[index];
}
static FROM = 0;
static TO = 1;
}
export default ControlPoint;

View File

@ -87,7 +87,7 @@ class Designer extends Events {
// Set up i18n location ...
console.log(`Editor location: ${options.locale}`);
Messages.init(options.locale);
Messages.init(options.locale ? options.locale : 'en');
this._options = options;
@ -263,7 +263,10 @@ class Designer extends Events {
} else {
$assert(targetTopic, 'Could not find a topic to connect');
}
topic.connectTo(targetTopic, this._workspace);
if (targetTopic) {
topic.connectTo(targetTopic, this._workspace);
}
}
topic.addEvent('ontblur', () => {
@ -405,7 +408,7 @@ class Designer extends Events {
$notify($msg('CLIPBOARD_IS_EMPTY'));
return;
}
this._actionDispatcher.addTopics(this._clipboard);
this._actionDispatcher.addTopics(this._clipboard, null);
this._clipboard = [];
}
@ -521,7 +524,7 @@ class Designer extends Events {
const parentTopic = topic.getOutgoingConnectedTopic();
const siblingModel = this._createSiblingModel(topic);
if (siblingModel) {
if (siblingModel && parentTopic) {
// Hack: if parent is central topic, add node below not on opposite side.
// This should be done in the layout
if (parentTopic.getType() === 'CentralTopic') {
@ -577,21 +580,18 @@ class Designer extends Events {
return { zoom: model.getZoom() };
}
/**
* @param {mindplot.Mindmap} mindmap
* @throws will throw an error if mindmapModel is null or undefined
*/
loadMap(mindmap: Mindmap): void {
loadMap(mindmap: Mindmap): Promise<void> {
$assert(mindmap, 'mindmapModel can not be null');
this._mindmap = mindmap;
this._workspace.enableQueueRender(true);
// Init layout manager ...
const size = { width: 25, height: 25 };
const layoutManager = new LayoutManager(mindmap.getCentralTopic().getId(), size);
const me = this;
layoutManager.addEvent('change', (event) => {
const id = event.getId();
const topic = me.getModel().findTopicById(id);
const topic = this.getModel().findTopicById(id);
if (topic) {
topic.setPosition(event.getPosition());
topic.setOrder(event.getOrder());
@ -601,23 +601,31 @@ class Designer extends Events {
// Building node graph ...
const branches = mindmap.getBranches();
const nodesGraph: Topic[] = [];
branches.forEach((branch) => {
const nodeGraph = this.nodeModelToTopic(branch);
nodeGraph.setBranchVisibility(true);
nodesGraph.push(nodeGraph);
});
// Connect relationships ...
const relationships = mindmap.getRelationships();
relationships.forEach((relationship) => this._relationshipModelToRelationship(relationship));
// Place the focus on the Central Topic
const centralTopic = this.getModel().getCentralTopic();
this.goToNode(centralTopic);
// Finally, sort the map ...
EventBus.instance.fireEvent('forceLayout');
return this._workspace.enableQueueRender(false).then(() => {
// Connect relationships ...
const relationships = mindmap.getRelationships();
relationships.forEach((relationship) => this._relationshipModelToRelationship(relationship));
this.fireEvent('loadSuccess');
// Render nodes ...
nodesGraph.forEach((topic) => topic.setVisibility(true));
// Enable workspace drag events ...
this._workspace.registerEvents();
// Finally, sort the map ...
EventBus.instance.fireEvent('forceLayout');
this.fireEvent('loadSuccess');
});
}
getMindmap(): Mindmap {
@ -718,24 +726,22 @@ class Designer extends Events {
);
// Build relationship line ....
const result = new Relationship(sourceTopic, targetTopic, model);
const me = this;
const result = new Relationship(sourceTopic!, targetTopic!, model);
result.addEvent('ontblur', () => {
const topics = me.getModel().filterSelectedTopics();
const rels = me.getModel().filterSelectedRelationships();
const topics = this.getModel().filterSelectedTopics();
const rels = this.getModel().filterSelectedRelationships();
if (topics.length === 0 || rels.length === 0) {
me.fireEvent('onblur');
this.fireEvent('onblur');
}
});
result.addEvent('ontfocus', () => {
const topics = me.getModel().filterSelectedTopics();
const rels = me.getModel().filterSelectedRelationships();
const topics = this.getModel().filterSelectedTopics();
const rels = this.getModel().filterSelectedRelationships();
if (topics.length === 1 || rels.length === 1) {
me.fireEvent('onfocus');
this.fireEvent('onfocus');
}
});
@ -762,7 +768,7 @@ class Designer extends Events {
const model = node.getModel();
model.deleteNode();
if ($defined(parent)) {
if (parent) {
this.goToNode(parent);
}
}

View File

@ -21,22 +21,28 @@ import PersistenceManager from './PersistenceManager';
import Designer from './Designer';
import { DesignerOptions } from './DesignerOptionsBuilder';
import WidgetManager from './WidgetManager';
import ReadOnlyWidgetManager from './ReadOnlyWidgetManager';
let designer: Designer;
export function buildDesigner(options: DesignerOptions): Designer {
const divContainer = options.divContainer ? $(options.divContainer) : $(`#${options.container}`);
$assert(divContainer, 'container could not be null');
if (designer) {
throw new Error('Designer can does not support multiple initializations');
}
// Register load events ...
designer = new Designer(options, divContainer);
// Configure default persistence manager ...
const persistence = options.persistenceManager;
$assert(persistence, 'persistence must be defined');
PersistenceManager.init(persistence);
const widgetManager = options.widgetManager ? options.widgetManager : new WidgetManager();
PersistenceManager.init(persistence!);
// If not manager was specifed, use the readonly one.
const widgetManager = options.widgetManager ? options.widgetManager : new ReadOnlyWidgetManager();
WidgetManager.init(widgetManager);
return designer;
}

View File

@ -24,7 +24,7 @@ export type DesignerOptions = {
zoom: number;
mode: EditorRenderMode;
mapId?: string;
divContainer?: HTMLElement;
divContainer: HTMLElement;
container: string;
persistenceManager?: PersistenceManager;
widgetManager?: WidgetManager;
@ -36,7 +36,7 @@ class OptionsBuilder {
static buildOptions(options: DesignerOptions): DesignerOptions {
$assert(options.persistenceManager, 'persistence must be defined');
const defaultOptions: DesignerOptions = {
const defaultOptions = {
mode: 'edition-owner',
zoom: 0.85,
saveOnLoad: true,

View File

@ -35,10 +35,10 @@ class DesignerUndoManager {
enqueue(command: Command) {
$assert(command, 'Command can not be null');
const { length } = this._undoQueue;
if (command.discardDuplicated && length > 0) {
if (command.getDiscardDuplicated() && length > 0) {
// Skip duplicated events ...
const lastItem = this._undoQueue[length - 1];
if (lastItem.discardDuplicated !== command.discardDuplicated) {
if (lastItem.getDiscardDuplicated() !== command.getDiscardDuplicated()) {
this._undoQueue.push(command);
}
} else {

View File

@ -17,6 +17,7 @@
*/
import { $assert, $defined } from '@wisemapping/core-js';
import { Point, CurvedLine, Rect } from '@wisemapping/web2d';
import PositionType from './PositionType';
import SizeType from './SizeType';
import Topic from './Topic';
@ -24,7 +25,7 @@ import Shape from './util/Shape';
import Workspace from './Workspace';
class DragPivot {
private _position: Point;
private _position: PositionType;
private _isVisible: boolean;
@ -41,7 +42,7 @@ class DragPivot {
private _size: SizeType;
constructor() {
this._position = new Point();
this._position = { x: 0, y: 0 };
this._size = DragPivot.DEFAULT_PIVOT_SIZE;
this._straightLine = this._buildStraightLine();

View File

@ -49,8 +49,8 @@ class DragTopic {
this._order = null;
this._draggedNode = draggedNode;
this._layoutManager = layoutManger;
this._position = new Point();
this._isInWorkspace = false;
this._position = new Point(0, 0);
}
setOrder(order: number): void {
@ -59,15 +59,14 @@ class DragTopic {
setPosition(x: number, y: number): void {
// Update drag shadow position ....
const position = { x, y };
this._position.setValue(position.x, position.y);
this._position = { x, y };
// Elements are positioned in the center.
// All topic element must be positioned based on the innerShape.
const draggedNode = this._draggedNode;
const size = draggedNode.getSize();
const cx = position.x - (position.x > 0 ? 0 : size.width);
const cy = Math.ceil(position.y - size.height / 2);
const cx = x - (x > 0 ? 0 : size.width);
const cy = Math.ceil(y - size.height / 2);
this._elem2d.setPosition(cx, cy);
// In case is not free, pivot must be draw ...
@ -108,8 +107,6 @@ class DragTopic {
}
connectTo(parent: Topic) {
$assert(parent, 'Parent connection node can not be null.');
// Where it should be connected ?
const predict = this._layoutManager.predict(
parent.getId(),
@ -178,8 +175,8 @@ class DragTopic {
const position = this.getPosition();
if (!this.isFreeLayoutOn()) {
let order = null;
let parent = null;
let order: number | null = null;
let parent: Topic | null = null;
const isDragConnected = this.isConnected();
if (isDragConnected) {
const targetTopic = this.getConnectedToTopic();

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import $ from 'jquery';
import PersistenceManager from './PersistenceManager';
class LocalStorageManager extends PersistenceManager {
@ -47,36 +46,36 @@ class LocalStorageManager extends PersistenceManager {
}
}
loadMapDom(mapId: string) {
let xml;
loadMapDom(mapId: string): Promise<Document> {
let result: Promise<Document>;
let localStorate;
if (!this.readOnly) {
xml = localStorage.getItem(`${mapId}-xml`);
localStorate = localStorage.getItem(`${mapId}-xml`);
}
if (xml == null || this.forceLoad) {
$.ajax({
url: this.documentUrl.replace('{id}', mapId),
if (localStorate == null || this.forceLoad) {
const url = this.documentUrl.replace('{id}', mapId);
result = fetch(url, {
method: 'get',
headers: {
'Content-Type': 'text/plain',
Accept: 'application/xml',
'X-CSRF-Token': this.getCSRFToken(),
},
type: 'get',
dataType: 'text',
async: false,
success(response) {
xml = response;
},
error(xhr, ajaxOptions, thrownError) {
console.error(`Request error => status:${xhr.status} ,thrownError: ${thrownError}`);
},
});
// If I could not load it from a file, hard code one.
if (xml == null) {
throw new Error(`Map could not be loaded with id:${mapId}`);
}
})
.then((response: Response) => {
if (!response.ok) {
console.error(`load error: ${response.status}`);
throw new Error(`load error: ${response.status}, ${response.statusText}`);
}
return response.text();
})
.then((xmlStr) => new DOMParser().parseFromString(xmlStr, 'text/xml'));
} else {
const doc = new DOMParser().parseFromString(localStorate, 'text/xml');
result = Promise.resolve(doc);
}
return $.parseXML(xml);
return result;
}
unlockMap(): void {

View File

@ -123,9 +123,8 @@ class MainTopic extends Topic {
const isAtRight = Shape.isAtRight(targetPosition, pos);
const size = this.getSize();
let result: Point;
let result: Point = { x: 0, y: 0 };
if (this.getShapeType() === TopicShape.LINE) {
result = new Point();
const groupPosition = this.get2DElement().getPosition();
const innerShareSize = this.getInnerShape().getSize();
@ -150,7 +149,7 @@ class MainTopic extends Topic {
} else {
result = Shape.calculateRectConnectionPoint(pos, size, isAtRight);
}
return result;
return new Point(result.x, result.y);
}
}

View File

@ -2,21 +2,18 @@ import Designer from './Designer';
import buildDesigner from './DesignerBuilder';
import DesignerOptionsBuilder from './DesignerOptionsBuilder';
import EditorRenderMode from './EditorRenderMode';
import LocalStorageManager from './LocalStorageManager';
import Mindmap from './model/Mindmap';
import PersistenceManager from './PersistenceManager';
import WidgetManager from './WidgetManager';
import mindplotStyles from './styles/mindplot-styles';
import { $notify } from './widget/ToolbarNotifier';
import { $msg } from './Messages';
import DesignerKeyboard from './DesignerKeyboard';
const defaultPersistenceManager = () => new LocalStorageManager('map.xml', false, false);
import LocalStorageManager from './LocalStorageManager';
export type MindplotWebComponentInterface = {
id: string;
mode: string;
ref: any;
ref: object;
locale?: string;
};
/**
@ -27,21 +24,24 @@ export type MindplotWebComponentInterface = {
class MindplotWebComponent extends HTMLElement {
private _shadowRoot: ShadowRoot;
private _mindmap: Mindmap;
private _designer: Designer;
private saveRequired: boolean;
private _isLoaded: boolean;
constructor() {
super();
this._shadowRoot = this.attachShadow({ mode: 'open' });
const mindplotStylesElement = document.createElement('style');
mindplotStylesElement.innerHTML = mindplotStyles;
this._shadowRoot.appendChild(mindplotStylesElement);
const wrapper = document.createElement('div');
wrapper.setAttribute('class', 'wise-editor');
wrapper.setAttribute('id', 'mindplot');
this._shadowRoot.appendChild(wrapper);
}
@ -60,7 +60,8 @@ class MindplotWebComponent extends HTMLElement {
buildDesigner(persistence?: PersistenceManager, widgetManager?: WidgetManager) {
const editorRenderMode = this.getAttribute('mode') as EditorRenderMode;
const locale = this.getAttribute('locale');
const persistenceManager = persistence || defaultPersistenceManager();
const persistenceManager = persistence || new LocalStorageManager('map.xml', false, false);
const mode = editorRenderMode || 'viewonly';
const options = DesignerOptionsBuilder.buildOptions({
persistenceManager,
@ -77,6 +78,16 @@ class MindplotWebComponent extends HTMLElement {
});
this.registerShortcuts();
this._designer.addEvent('loadSuccess', (): void => {
this._isLoaded = true;
});
return this._designer;
}
isLoaded(): boolean {
return this._isLoaded;
}
private registerShortcuts() {
@ -88,27 +99,19 @@ class MindplotWebComponent extends HTMLElement {
}
}
setSaveRequired(arg0: boolean) {
this.saveRequired = arg0;
setSaveRequired(value: boolean) {
this.saveRequired = value;
}
getSaveRequired() {
return this.saveRequired;
}
/**
* Load map in designer throught persistence manager instance
* @param id the map id to be loaded.
*/
loadMap(id: string) {
loadMap(id: string): Promise<void> {
const instance = PersistenceManager.getInstance();
this._mindmap = instance.load(id);
this._designer.loadMap(this._mindmap);
return instance.load(id).then((mindmap) => this._designer.loadMap(mindmap));
}
/**
* save the map
*/
save(saveHistory: boolean) {
if (!saveHistory && !this.getSaveRequired()) return;
console.log('Saving...');
@ -138,22 +141,6 @@ class MindplotWebComponent extends HTMLElement {
this.setSaveRequired(false);
}
discardChanges() {
// Avoid autosave before leaving the page ....
// this.setRequireChange(false);
// Finally call discard function ...
const persistenceManager = PersistenceManager.getInstance();
const mindmap = this._designer.getMindmap();
persistenceManager.discardChanges(mindmap.getId());
// Unlock map ...
this.unlockMap();
// Reload the page ...
window.location.reload();
}
unlockMap() {
const mindmap = this._designer.getMindmap();
const persistenceManager = PersistenceManager.getInstance();

View File

@ -36,8 +36,8 @@ class MockPersistenceManager extends PersistenceManager {
// Ignore, no implementation required ...
}
loadMapDom() {
return $.parseXML(this.exampleMap);
loadMapDom(): Promise<Document> {
return Promise.resolve($.parseXML(this.exampleMap));
}
unlockMap(): void {

View File

@ -1,3 +1,4 @@
/* eslint-disable max-classes-per-file */
/*
* Copyright [2021] [wisemapping]
*
@ -18,18 +19,23 @@
import { $defined } from '@wisemapping/core-js';
import $ from 'jquery';
import Events from './Events';
import ActionDispatcher from './ActionDispatcher';
import Events from './Events';
import Topic from './Topic';
class MultilineTextEditor extends Events {
class EditorComponent extends Events {
private _topic: Topic;
private _containerElem: JQuery;
private _containerElem: JQuery<HTMLElement>;
constructor() {
constructor(topic: Topic) {
super();
this._topic = null;
this._topic = topic;
// Create editor ui
this._containerElem = EditorComponent._buildEditor();
$('body').append(this._containerElem);
this._registerEvents(this._containerElem);
}
private static _buildEditor() {
@ -52,7 +58,7 @@ class MultilineTextEditor extends Events {
return result;
}
private _registerEvents(containerElem: JQuery) {
private _registerEvents(containerElem: JQuery): void {
const textareaElem = this._getTextareaElem();
textareaElem.on('keydown', (event) => {
switch (event.code) {
@ -108,31 +114,25 @@ class MultilineTextEditor extends Events {
}
private _adjustEditorSize() {
if (this.isVisible()) {
const textElem = this._getTextareaElem();
const textElem = this._getTextareaElem();
const lines = this._getTextAreaText().split('\n');
let maxLineLength = 1;
lines.forEach((line: string) => {
maxLineLength = Math.max(line.length, maxLineLength);
});
const lines = this._getTextAreaText().split('\n');
let maxLineLength = 1;
lines.forEach((line: string) => {
maxLineLength = Math.max(line.length, maxLineLength);
});
textElem.attr('cols', maxLineLength);
textElem.attr('rows', lines.length);
textElem.attr('cols', maxLineLength);
textElem.attr('rows', lines.length);
this._containerElem.css({
width: `${maxLineLength + 2}em`,
height: textElem.height(),
});
}
}
isVisible(): boolean {
return $defined(this._containerElem) && this._containerElem.css('display') === 'block';
this._containerElem.css({
width: `${maxLineLength + 2}em`,
height: textElem?.height() || 0,
});
}
private _updateModel() {
if (this._topic.getText() !== this._getTextAreaText()) {
if (this._topic && this._topic.getText() !== this._getTextAreaText()) {
const text = this._getTextAreaText();
const topicId = this._topic.getId();
@ -147,25 +147,7 @@ class MultilineTextEditor extends Events {
}
}
show(topic: Topic, text: string): void {
// Close a previous node editor if it's opened ...
if (this._topic) {
this.close(false);
}
this._topic = topic;
if (!this.isVisible()) {
// Create editor ui
const containerElem = MultilineTextEditor._buildEditor();
$('body').append(containerElem);
this._containerElem = containerElem;
this._registerEvents(containerElem);
this._showEditor(text);
}
}
private _showEditor(defaultText: string) {
show(defaultText: string) {
const topic = this._topic;
// Hide topic text ...
@ -191,15 +173,23 @@ class MultilineTextEditor extends Events {
this._containerElem.offset({ top, left });
// Set editor's initial text ...
const text = $defined(defaultText) ? defaultText : topic.getText();
const text = defaultText || topic.getText();
this._setText(text);
// Set the element focus and select the current text ...
const inputElem = this._getTextareaElem();
this._positionCursor(inputElem, !$defined(defaultText));
if (inputElem) {
this._positionCursor(inputElem, !$defined(defaultText));
}
}
private _setStyle(fontStyle) {
private _setStyle(fontStyle: {
fontFamily: string;
style: string;
weight: string;
size: number;
color: string;
}) {
const inputField = this._getTextareaElem();
// allowed param reassign to avoid risks of existing code relying in this side-effect
/* eslint-disable no-param-reassign */
@ -253,20 +243,47 @@ class MultilineTextEditor extends Events {
}
close(update: boolean): void {
if (this.isVisible()) {
if (update) {
this._updateModel();
}
// Remove it form the screen ...
this._containerElem.remove();
this._containerElem = null;
if (update) {
this._updateModel();
}
// Remove it form the screen ...
this._containerElem.remove();
if (this._topic) {
this._topic.getTextShape().setVisibility(true);
this._topic = null;
// Restore topoc share visibility ...
this._topic.getTextShape().setVisibility(true);
}
}
class MultitTextEditor {
// eslint-disable-next-line no-use-before-define
private static instance: MultitTextEditor = new MultitTextEditor();
private component: EditorComponent | null;
static getInstance(): MultitTextEditor {
return MultitTextEditor.instance;
}
isActive(): boolean {
return this.component !== null;
}
show(topic: Topic, defaultText: string): void {
// Is it active ?
if (this.component) {
console.error('Editor was already displayed. Please, clouse it');
this.component.close(false);
}
// Create a new instance
this.component = new EditorComponent(topic);
this.component.show(defaultText);
}
close(update: boolean): void {
if (this.component) {
this.component.close(update);
this.component = null;
}
}
}
export default MultilineTextEditor;
export default MultitTextEditor;

View File

@ -54,17 +54,18 @@ abstract class PersistenceManager {
protected getCSRFToken(): string | null {
const meta = document.head.querySelector('meta[name="_csrf"]');
let result = null;
let result: string | null = null;
if (meta) {
result = meta.getAttribute('content');
}
return result;
}
load(mapId: string) {
async load(mapId: string): Promise<Mindmap> {
$assert(mapId, 'mapId can not be null');
const domDocument = this.loadMapDom(mapId);
return PersistenceManager.loadFromDom(mapId, domDocument);
// eslint-disable-next-line arrow-body-style
const document = await this.loadMapDom(mapId);
return PersistenceManager.loadFromDom(mapId, document);
}
triggerError(error: PersistenceError) {
@ -75,7 +76,7 @@ abstract class PersistenceManager {
this._errorHandlers.push(callback);
}
removeErrorHandler(callback?: PersistenceErrorCallback) {
removeErrorHandler(callback?: PersistenceErrorCallback): void {
if (!callback) {
this._errorHandlers.length = 0;
}
@ -87,7 +88,7 @@ abstract class PersistenceManager {
abstract discardChanges(mapId: string): void;
abstract loadMapDom(mapId: string): Document;
abstract loadMapDom(mapId: string): Promise<Document>;
abstract saveMapXml(mapId: string, mapXml: Document, pref?, saveHistory?: boolean, events?);

View File

@ -0,0 +1,30 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.
*/
import WidgetManager from './WidgetManager';
class ReadOnlyWidgetManager extends WidgetManager {
showEditorForLink(): void {
throw new Error('ReadOnly widget manager does not support edition');
}
showEditorForNote(): void {
throw new Error('ReadOnly widget manager does not support edition');
}
}
export default ReadOnlyWidgetManager;

View File

@ -16,9 +16,9 @@
* limitations under the License.
*/
import { $assert, $defined } from '@wisemapping/core-js';
import { Arrow, Point, ElementClass } from '@wisemapping/web2d';
import { Arrow, Point, CurvedLine } from '@wisemapping/web2d';
import ConnectionLine from './ConnectionLine';
import ControlPoint from './ControlPoint';
import RelationshipControlPoints from './RelationshipControlPoints';
import RelationshipModel from './model/RelationshipModel';
import PositionType from './PositionType';
import Topic from './Topic';
@ -26,13 +26,13 @@ import Shape from './util/Shape';
import Workspace from './Workspace';
class Relationship extends ConnectionLine {
private _focusShape: ElementClass;
private _focusShape: CurvedLine;
private _onFocus: boolean;
private _isInWorkspace: boolean;
private _controlPointsController: ControlPoint;
private _controlPointsController: RelationshipControlPoints;
private _startArrow: Arrow;
@ -40,7 +40,7 @@ class Relationship extends ConnectionLine {
private _endArrow: Arrow;
private _controlPointControllerListener;
private _onFocusHandler: (event: MouseEvent) => void;
private _showStartArrow: Arrow;
@ -53,23 +53,24 @@ class Relationship extends ConnectionLine {
const strokeColor = Relationship.getStrokeColor();
// Build line ..
this._line2d.setIsSrcControlPointCustom(false);
this._line2d.setIsDestControlPointCustom(false);
this._line2d.setCursor('pointer');
this._line2d.setStroke(1, 'solid', strokeColor);
this._line2d.setDashed(4, 2);
this._line2d.setTestId(`${model.getFromNode()}-${model.getToNode()}-relationship`);
// Build focus shape ...
this._focusShape = this._createLine(this.getLineType(), ConnectionLine.SIMPLE_CURVED);
this._focusShape.setStroke(2, 'solid', '#3f96ff');
const ctrlPoints = this._line2d.getControlPoints();
this._focusShape.setSrcControlPoint(ctrlPoints[0]);
this._focusShape.setDestControlPoint(ctrlPoints[1]);
this._focusShape.setVisibility(false);
this._onFocus = false;
this._isInWorkspace = false;
this._controlPointsController = new ControlPoint();
this._focusShape.setStroke(8, 'solid', '#3f96ff');
this._focusShape.setIsSrcControlPointCustom(false);
this._focusShape.setIsDestControlPointCustom(false);
this._focusShape.setVisibility(true);
this._focusShape.setOpacity(0);
this._focusShape.setCursor('pointer');
// Build arrow ...
this._startArrow = new Arrow();
this._startArrow.setStrokeColor(strokeColor);
this._startArrow.setStrokeWidth(2);
@ -81,22 +82,32 @@ class Relationship extends ConnectionLine {
this._endArrow.setStrokeColor(strokeColor);
this._endArrow.setStrokeWidth(2);
}
this._onFocus = false;
this._isInWorkspace = false;
this._controlPointsController = new RelationshipControlPoints(this);
// Position the line ...
if ($defined(model.getSrcCtrlPoint())) {
if (model.getSrcCtrlPoint()) {
const srcPoint = { ...model.getSrcCtrlPoint() };
this.setSrcControlPoint(srcPoint);
// Set test id in control point
this._controlPointsController.setControlPointTestId(
`control-${Math.abs(srcPoint.x)}`,
`control-${Math.abs(srcPoint.y)}`,
);
}
if ($defined(model.getDestCtrlPoint())) {
if (model.getDestCtrlPoint()) {
const destPoint = { ...model.getDestCtrlPoint() };
this.setDestControlPoint(destPoint);
}
// Reposition all nodes ...
this.updatePositions();
this._controlPointsController = new RelationshipControlPoints(this);
// Initialize handler ..
this._onFocusHandler = (event) => {
this.setOnFocus(true);
event.stopPropagation();
event.preventDefault();
};
}
setStroke(color: string, style: string, opacity: number): void {
@ -104,67 +115,80 @@ class Relationship extends ConnectionLine {
this._startArrow.setStrokeColor(color);
}
redraw(): void {
private updatePositions() {
const line2d = this._line2d;
const sourceTopic = this._sourceTopic;
const sourcePosition = sourceTopic.getPosition();
const sPos = sourceTopic.getPosition();
const targetTopic = this._targetTopic;
let targetPosition = targetTopic.getPosition();
let tPos = targetTopic.getPosition();
if (targetTopic.getType() === 'CentralTopic') {
targetPosition = Shape.workoutIncomingConnectionPoint(targetTopic, sourcePosition);
tPos = Shape.workoutIncomingConnectionPoint(targetTopic, sPos);
}
this._line2d.setStroke(2);
const ctrlPoints = this._line2d.getControlPoints();
if (!this._line2d.isDestControlPointCustom() && !this._line2d.isSrcControlPointCustom()) {
const defaultPoints = Shape.calculateDefaultControlPoints(sourcePosition, targetPosition);
ctrlPoints[0].x = defaultPoints[0].x;
ctrlPoints[0].y = defaultPoints[0].y;
let ctrlPoints: [Point, Point];
ctrlPoints[1].x = defaultPoints[1].x;
ctrlPoints[1].y = defaultPoints[1].y;
// Position line ...
if (!line2d.isDestControlPointCustom() && !line2d.isSrcControlPointCustom()) {
ctrlPoints = Shape.calculateDefaultControlPoints(sPos, tPos) as [PositionType, PositionType];
} else {
ctrlPoints = line2d.getControlPoints();
}
const spoint = new Point();
spoint.x = parseInt(ctrlPoints[0].x, 10) + parseInt(sourcePosition.x, 10);
spoint.y = parseInt(ctrlPoints[0].y, 10) + parseInt(sourcePosition.y, 10);
const spointX = ctrlPoints[0].x + sPos.x;
const spointY = ctrlPoints[0].y + sPos.y;
const tpoint = new Point();
tpoint.x = parseInt(ctrlPoints[1].x, 10) + parseInt(targetPosition.x, 10);
tpoint.y = parseInt(ctrlPoints[1].y, 10) + parseInt(targetPosition.y, 10);
const tpointX = ctrlPoints[1].x + tPos.x;
const tpointY = ctrlPoints[1].y + tPos.y;
const sPos = Shape.calculateRelationShipPointCoordinates(sourceTopic, spoint);
const tPos = Shape.calculateRelationShipPointCoordinates(targetTopic, tpoint);
const nsPos = Shape.calculateRelationShipPointCoordinates(
sourceTopic,
new Point(spointX, spointY),
);
const ntPos = Shape.calculateRelationShipPointCoordinates(
targetTopic,
new Point(tpointX, tpointY),
);
line2d.setFrom(sPos.x, sPos.y);
line2d.setTo(tPos.x, tPos.y);
line2d.moveToFront();
line2d.setFrom(nsPos.x, nsPos.y);
line2d.setTo(ntPos.x, ntPos.y);
// Positionate Arrows
this._positionArrows();
this.positionArrows();
// Add connector ...
this._positionateConnector(targetTopic);
if (this.isOnFocus()) {
this._refreshShape();
// Poisition refresh shape ...
this.positionRefreshShape();
}
redraw(): void {
this.updatePositions();
this._line2d.moveToFront();
this._startArrow.moveToBack();
if (this._endArrow) {
this._endArrow.moveToBack();
}
if (this._showEndArrow) {
this._endArrow.setVisibility(this.isVisible());
}
this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
this._focusShape.moveToBack();
this._controlPointsController.redraw();
}
private _positionArrows(): void {
private positionArrows(): void {
const tpos = this._line2d.getTo();
const spos = this._line2d.getFrom();
this._startArrow.setFrom(spos.x, spos.y);
this._startArrow.moveToBack();
if (this._endArrow) {
this._endArrow.setFrom(tpos.x, tpos.y);
this._endArrow.moveToBack();
}
if (this._line2d.getType() === 'CurvedLine') {
@ -179,22 +203,19 @@ class Relationship extends ConnectionLine {
this._endArrow.setControlPoint(this._line2d.getFrom());
}
}
if (this._showEndArrow) {
this._endArrow.setVisibility(this.isVisible());
}
this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
}
addToWorkspace(workspace: Workspace): void {
this.updatePositions();
workspace.append(this._focusShape);
workspace.append(this._controlPointsController);
this._controlPointControllerListener = this._initializeControlPointController.bind(this);
if (workspace.isReadOnly()) {
this._line2d.setCursor('default');
} else {
this._line2d.addEvent('click', this._controlPointControllerListener);
this._line2d.addEvent('click', this._onFocusHandler);
this._focusShape.addEvent('click', this._onFocusHandler);
}
this._isInWorkspace = true;
@ -202,23 +223,20 @@ class Relationship extends ConnectionLine {
if (this._endArrow) workspace.append(this._endArrow);
super.addToWorkspace(workspace);
this._positionArrows();
this.positionArrows();
this.redraw();
}
private _initializeControlPointController(): void {
this.setOnFocus(true);
}
removeFromWorkspace(workspace: Workspace): void {
workspace.removeChild(this._focusShape);
workspace.removeChild(this._controlPointsController);
if (!workspace.isReadOnly) {
this._line2d.removeEvent('click', this._controlPointControllerListener);
}
this._line2d.removeEvent('click', this._onFocusHandler);
this._isInWorkspace = false;
workspace.removeChild(this._startArrow);
if (this._endArrow) workspace.removeChild(this._endArrow);
if (this._endArrow) {
workspace.removeChild(this._endArrow);
}
super.removeFromWorkspace(workspace);
}
@ -228,13 +246,14 @@ class Relationship extends ConnectionLine {
}
setOnFocus(focus: boolean): void {
if (focus) {
this.positionRefreshShape();
}
// Change focus shape
if (this.isOnFocus() !== focus) {
if (focus) {
this._refreshShape();
this._controlPointsController.setLine(this);
}
this._focusShape.setVisibility(focus);
// Focus is always present to support on over
this._focusShape.setOpacity(focus ? 1 : 0);
this._focusShape.setStroke(focus ? 2 : 8, 'solid', '#3f96ff');
this._controlPointsController.setVisibility(focus);
this._onFocus = focus;
@ -242,17 +261,17 @@ class Relationship extends ConnectionLine {
}
}
private _refreshShape(): void {
private positionRefreshShape(): void {
const sPos = this._line2d.getFrom();
const tPos = this._line2d.getTo();
const ctrlPoints = this._line2d.getControlPoints();
this._focusShape.setFrom(sPos.x, sPos.y);
this._focusShape.setTo(tPos.x, tPos.y);
const shapeCtrlPoints = this._focusShape.getControlPoints();
shapeCtrlPoints[0].x = ctrlPoints[0].x;
shapeCtrlPoints[0].y = ctrlPoints[0].y;
shapeCtrlPoints[1].x = ctrlPoints[1].x;
shapeCtrlPoints[1].y = ctrlPoints[1].y;
this._focusShape.setSrcControlPoint(ctrlPoints[0]);
this._focusShape.setDestControlPoint(ctrlPoints[1]);
this._focusShape.updateLine();
}
@ -282,10 +301,13 @@ class Relationship extends ConnectionLine {
// If visibility change, remove the on focus.
this.setOnFocus(false);
// Hide on gocus shade ...
if (this._showEndArrow) {
this._endArrow.setVisibility(this._showEndArrow);
}
this._startArrow.setVisibility(this._showStartArrow && value, fade);
this._focusShape.setVisibility(value);
}
setOpacity(opacity: number): void {
@ -305,12 +327,12 @@ class Relationship extends ConnectionLine {
}
}
setShowStartArrow(visible: boolean) {
setShowStartArrow(visible: boolean): void {
this._showStartArrow = visible;
if (this._isInWorkspace) this.redraw();
}
setFrom(x: number, y: number) {
setFrom(x: number, y: number): void {
$assert($defined(x), 'x must be defined');
$assert($defined(y), 'y must be defined');
@ -328,12 +350,16 @@ class Relationship extends ConnectionLine {
setSrcControlPoint(control: PositionType): void {
this._line2d.setSrcControlPoint(control);
this._focusShape.setSrcControlPoint(control);
this._startArrow.setControlPoint(control);
}
setDestControlPoint(control: PositionType) {
this._line2d.setDestControlPoint(control);
if (this._showEndArrow) this._endArrow.setControlPoint(control);
this._focusShape.setSrcControlPoint(control);
if (this._showEndArrow) {
this._endArrow.setControlPoint(control);
}
}
getControlPoints(): PositionType {

View File

@ -0,0 +1,282 @@
/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.
*/
// eslint-disable-next-line max-classes-per-file
import { Elipse, Line } from '@wisemapping/web2d';
import Shape from './util/Shape';
import ActionDispatcher from './ActionDispatcher';
import Workspace from './Workspace';
import PositionType from './PositionType';
import Relationship from './Relationship';
// eslint-disable-next-line no-shadow
export enum PivotType {
Start = 0,
End = 1,
}
class ControlPivotLine {
private _dot: Elipse;
private _line: Line;
private _pivotType: PivotType;
private _workspace: Workspace;
private _relationship: Relationship;
private _changeHander: () => void;
private _moveRelHandler: (controlPointPosition: PositionType) => void;
private _isVisible: boolean;
private _mouseMoveHandler: (e: MouseEvent) => void;
private _mouseUpHandler: () => void;
private _mouseDownHandler: (event: MouseEvent) => void;
constructor(
pivotType: PivotType,
relationship: Relationship,
mouseMoveHandler: (controlPointPosition: PositionType) => void,
changeHander: () => void,
) {
this._pivotType = pivotType;
this._changeHander = changeHander;
this._moveRelHandler = mouseMoveHandler;
this._relationship = relationship;
// Build dot controller ...
this._dot = new Elipse({
width: 6,
height: 6,
stroke: '1 solid #6589de',
fillColor: 'gray',
visibility: false,
});
this._dot.setCursor('pointer');
// Build line ...
this._line = new Line({ strokeColor: '#6589de', strokeWidth: 1, opacity: 0.3 });
const mouseClick = (event: MouseEvent): boolean => {
event.preventDefault();
event.stopPropagation();
return false;
};
this._dot.addEvent('click', mouseClick);
this._dot.addEvent('dblclick', mouseClick);
// Register handled ...
this._mouseMoveHandler = (e: MouseEvent) => this.mouseMoveHandler(e);
this._mouseUpHandler = () => this.mouseUpHandler();
this._mouseDownHandler = (event: MouseEvent) => this.mouseDownHandler(event);
}
private mouseDownHandler(event: MouseEvent) {
const screenManager = this.getWorkspace().getScreenManager();
screenManager.addEvent('mousemove', this._mouseMoveHandler);
screenManager.addEvent('mouseup', this._mouseUpHandler);
event.preventDefault();
event.stopPropagation();
}
setVisibility(value: boolean) {
if (this._isVisible !== value) {
const screenManager = this.getWorkspace().getScreenManager();
if (!value) {
screenManager.removeEvent('mousemove', this._mouseMoveHandler);
screenManager.removeEvent('mouseup', this._mouseUpHandler);
this._dot.removeEvent('mousedown', this._mouseDownHandler);
} else {
// Register events ...
this._dot.addEvent('mousedown', this._mouseDownHandler);
}
// Make it visible ...
this._dot.setVisibility(value);
this._line.setVisibility(value);
}
this._isVisible = value;
if (value) {
// Register events ...
this.redraw();
this._line.moveToFront();
this._dot.moveToFront();
}
}
getPosition(): PositionType {
const line = this._relationship.getLine();
return line.getControlPoints()[this._pivotType];
}
redraw(): void {
if (this._isVisible) {
const relationshipLine = this._relationship.getLine();
const startPosition =
this._pivotType === PivotType.End ? relationshipLine.getTo() : relationshipLine.getFrom();
const ctrPosition = relationshipLine.getControlPoints()[this._pivotType];
this._line.setFrom(startPosition.x, startPosition.y);
this._line.setTo(startPosition.x + ctrPosition.x - 5, startPosition.y + ctrPosition.y - 5);
this._dot.setPosition(
startPosition.x + ctrPosition.x - 8,
startPosition.y + ctrPosition.y - 8,
);
}
}
private mouseMoveHandler(event: MouseEvent) {
const screen = this._workspace.getScreenManager();
const mousePosition = screen.getWorkspaceMousePosition(event);
// Update relatioship position ...
const topic =
this._pivotType === PivotType.Start
? this._relationship.getSourceTopic()
: this._relationship.getTargetTopic();
let relPos = Shape.calculateRelationShipPointCoordinates(topic, mousePosition);
const ctlPoint = { x: mousePosition.x - relPos.x, y: mousePosition.y - relPos.y };
this._moveRelHandler(ctlPoint);
// Update pivot ...
this._dot.setPosition(mousePosition.x - 8, mousePosition.y - 8);
// Update line ...
this._line.setTo(mousePosition.x - 5, mousePosition.y - 5);
relPos =
this._pivotType === PivotType.Start
? this._relationship.getLine().getFrom()
: this._relationship.getLine().getTo();
this._line.setFrom(relPos.x, relPos.y);
}
private mouseUpHandler() {
const screenManager = this.getWorkspace().getScreenManager();
screenManager.removeEvent('mousemove', this._mouseMoveHandler);
screenManager.removeEvent('mouseup', this._mouseUpHandler);
this._changeHander();
}
addToWorkspace(workspace: Workspace): void {
this._workspace = workspace;
workspace.append(this._line);
workspace.append(this._dot);
}
removeFromWorkspace(workspace: Workspace) {
// Hide all elements ...
this.setVisibility(false);
// Remove elements ...
workspace.removeChild(this._line);
workspace.removeChild(this._dot);
}
private getWorkspace(): Workspace {
return this._workspace!;
}
}
class RelationshipControlPoints {
// Visual element ...
private _pivotLines: [ControlPivotLine, ControlPivotLine];
private _relationship: Relationship;
private _relationshipLinePositions: [PositionType, PositionType];
constructor(relationship: Relationship) {
this._relationship = relationship;
const startControlLine = new ControlPivotLine(
PivotType.Start,
relationship,
(controlPointPosition) => {
const line = this._relationship.getLine();
line.setSrcControlPoint(controlPointPosition);
relationship.redraw();
},
() => {
const actionDispatcher = ActionDispatcher.getInstance();
actionDispatcher.moveControlPoint(
relationship.getModel(),
this.getControlPointPosition(PivotType.Start),
PivotType.Start,
);
},
);
const endControlLine = new ControlPivotLine(
PivotType.End,
relationship,
(controlPointPosition) => {
const line = this._relationship.getLine();
line.setDestControlPoint(controlPointPosition);
relationship.redraw();
},
() => {
const actionDispatcher = ActionDispatcher.getInstance();
actionDispatcher.moveControlPoint(
relationship.getModel(),
this.getControlPointPosition(PivotType.End),
PivotType.End,
);
},
);
this._pivotLines = [startControlLine, endControlLine];
}
addToWorkspace(workspace: Workspace): void {
this._pivotLines.forEach((pivot) => workspace.append(pivot));
}
removeFromWorkspace(workspace: Workspace) {
this._pivotLines.forEach((pivot) => workspace.removeChild(pivot));
}
getRelationship() {
return this._relationship;
}
redraw() {
this._pivotLines.forEach((pivot) => pivot.redraw());
}
setVisibility(value: boolean) {
this._pivotLines.forEach((pivot) => pivot.setVisibility(value));
}
getControlPointPosition(pivotType: PivotType): PositionType {
return this._pivotLines[pivotType].getPosition();
}
getRelationshipPosition(index: number): PositionType {
return { ...this._relationshipLinePositions[index] };
}
}
export default RelationshipControlPoints;

View File

@ -152,11 +152,11 @@ class RelationshipPivot {
sourcePosition = Shape.workoutIncomingConnectionPoint(this._sourceTopic, toPosition);
}
const controlPoint = Shape.calculateDefaultControlPoints(sourcePosition, toPosition);
const spoint = new Point();
spoint.x = parseInt(controlPoint[0].x, 10) + sourcePosition.x;
spoint.y = parseInt(controlPoint[0].y, 10) + sourcePosition.y;
return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, spoint);
const point = new Point(
parseInt(controlPoint[0].x, 10) + sourcePosition.x,
parseInt(controlPoint[0].y, 10) + sourcePosition.y,
);
return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, point);
}
private _connectOnFocus(event: string, targetTopic: Topic): void {

View File

@ -16,7 +16,6 @@
* limitations under the License.
*/
import { $assert } from '@wisemapping/core-js';
import $ from 'jquery';
import { $msg } from './Messages';
import PersistenceManager, { PersistenceError } from './PersistenceManager';
@ -157,31 +156,24 @@ class RESTPersistenceManager extends PersistenceManager {
return { severity, message };
}
loadMapDom(mapId: string): Document {
let xml: Document;
$.ajax({
url: `${this.documentUrl.replace('{id}', mapId)}/xml`,
loadMapDom(mapId: string): Promise<Document> {
const url = `${this.documentUrl.replace('{id}', mapId)}/xml`;
return fetch(url, {
method: 'get',
async: false,
headers: {
'Content-Type': 'text/plain',
Accept: 'application/xml',
'X-CSRF-Token': this.getCSRFToken(),
},
success(responseText) {
xml = responseText;
},
error(xhr, ajaxOptions, thrownError) {
console.error(`Request error => status:${xhr.status} ,thrownError: ${thrownError}`);
},
});
// If I could not load it from a file, hard code one.
if (xml == null) {
throw new Error(`Map with id ${mapId} could not be loaded`);
}
return xml;
})
.then((response: Response) => {
if (!response.ok) {
console.error(`load error: ${response.status}`);
throw new Error(`load error: ${response.status}, ${response.statusText}`);
}
return response.text();
})
.then((xmlStr) => new DOMParser().parseFromString(xmlStr, 'text/xml'));
}
}

View File

@ -16,7 +16,7 @@
* limitations under the License.
*/
import $ from 'jquery';
import { $assert } from '@wisemapping/core-js';
import { $assert, $defined } from '@wisemapping/core-js';
import { Point } from '@wisemapping/web2d';
// https://stackoverflow.com/questions/60357083/does-not-use-passive-listeners-to-improve-scrolling-performance-lighthouse-repo
// https://web.dev/uses-passive-event-listeners/?utm_source=lighthouse&utm_medium=lr
@ -85,7 +85,7 @@ class ScreenManager {
}
}
fireEvent(type: string, event: UIEvent = null) {
fireEvent(type: string, event?: UIEvent): void {
if (type === 'click') {
this._clickEvents.forEach((listener) => {
listener(type, event);
@ -99,26 +99,22 @@ class ScreenManager {
private tocuchEvents = ['touchstart', 'touchend', 'touchmove'];
// the received type was changed from MouseEvent to "any", because we must support touch events
getWorkspaceMousePosition(event: any) {
let x;
let y;
getWorkspaceMousePosition(event: MouseEvent | TouchEvent): Point {
let x: number | null = null;
let y: number | null = null;
if (this.mouseEvents.includes(event.type)) {
// Retrieve current mouse position.
x = event.clientX;
y = event.clientY;
x = (event as MouseEvent).clientX;
y = (event as MouseEvent).clientY;
} else if (this.tocuchEvents.includes(event.type)) {
x = event.touches[0].clientX;
y = event.touches[0].clientY;
x = (event as TouchEvent).touches[0].clientX;
y = (event as TouchEvent).touches[0].clientY;
}
// if value is zero assert throws error
if (x !== 0) {
$assert(x, `clientX can not be null, eventType= ${event.type}`);
}
if (y !== 0) {
$assert(y, `clientY can not be null, eventType= ${event.type}`);
if (x === null || y === null) {
throw new Error(`Coordinated can not be null, eventType= ${event.type}`);
}
// Adjust the deviation of the container positioning ...
@ -138,11 +134,11 @@ class ScreenManager {
return new Point(x, y);
}
getContainer() {
getContainer(): JQuery {
return this._divContainer;
}
setOffset(x: number, y: number) {
setOffset(x: number, y: number): void {
this._padding.x = x;
this._padding.y = y;
}

View File

@ -35,6 +35,8 @@ import RelationshipModel from './model/RelationshipModel';
import Topic from './Topic';
import Command from './Command';
import FeatureType from './model/FeatureType';
import PositionType from './PositionType';
import { PivotType } from './RelationshipControlPoints';
class StandaloneActionDispatcher extends ActionDispatcher {
private _actionRunner: DesignerActionRunner;
@ -52,7 +54,7 @@ class StandaloneActionDispatcher extends ActionDispatcher {
this._actionRunner = new DesignerActionRunner(commandContext, this);
}
addTopics(models: NodeModel[], parentTopicsId: number[] = undefined) {
addTopics(models: NodeModel[], parentTopicsId: number[] | null) {
const command = new AddTopicCommand(models, parentTopicsId);
this.execute(command);
}
@ -93,8 +95,8 @@ class StandaloneActionDispatcher extends ActionDispatcher {
}
/** */
moveControlPoint(ctrlPoint: Point, point: Point) {
const command = new MoveControlPointCommand(ctrlPoint, point);
moveControlPoint(model: RelationshipModel, ctrlPoint: PositionType, index: PivotType): void {
const command = new MoveControlPointCommand(model, ctrlPoint, index);
this.execute(command);
}
@ -106,7 +108,7 @@ class StandaloneActionDispatcher extends ActionDispatcher {
topic.setFontStyle(style, true);
return result;
};
const command = new GenericFunctionCommand(commandFunc, topicsIds);
const command = new GenericFunctionCommand(commandFunc, topicsIds, null);
this.execute(command);
}
@ -153,7 +155,7 @@ class StandaloneActionDispatcher extends ActionDispatcher {
};
const command = new GenericFunctionCommand(commandFunc, topicsIds, color);
command.discardDuplicated = 'fontColorCommandId';
command.setDiscardDuplicated('fontColorCommandId');
this.execute(command);
}
@ -169,7 +171,7 @@ class StandaloneActionDispatcher extends ActionDispatcher {
};
const command = new GenericFunctionCommand(commandFunc, topicsIds, color);
command.discardDuplicated = 'backColor';
command.setDiscardDuplicated('backColor');
this.execute(command);
}
@ -185,7 +187,7 @@ class StandaloneActionDispatcher extends ActionDispatcher {
};
const command = new GenericFunctionCommand(commandFunc, topicsIds, color);
command.discardDuplicated = 'borderColorCommandId';
command.setDiscardDuplicated('borderColorCommandId');
this.execute(command);
}
@ -234,7 +236,7 @@ class StandaloneActionDispatcher extends ActionDispatcher {
return result;
};
const command = new GenericFunctionCommand(commandFunc, topicsIds);
const command = new GenericFunctionCommand(commandFunc, topicsIds, null);
this.execute(command);
}

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import $ from 'jquery';
import { $assert, $defined } from '@wisemapping/core-js';
import { Rect, Image, Line, Text, Group, ElementClass, Point } from '@wisemapping/web2d';
@ -147,7 +146,7 @@ abstract class Topic extends NodeGraph {
// Move connector to front
const connector = this.getShrinkConnector();
if ($defined(connector)) {
if (connector) {
connector.moveToFront();
}
}
@ -508,7 +507,7 @@ abstract class Topic extends NodeGraph {
}
}
private _setText(text: string, updateModel?: boolean) {
private _setText(text: string | null, updateModel?: boolean) {
const textShape = this.getTextShape();
textShape.setText(text == null ? TopicStyle.defaultText(this) : text);
@ -520,7 +519,7 @@ abstract class Topic extends NodeGraph {
setText(text: string) {
// Avoid empty nodes ...
if (!text || $.trim(text).length === 0) {
if (!text || text.trim().length === 0) {
this._setText(null, true);
} else {
this._setText(text, true);
@ -531,11 +530,8 @@ abstract class Topic extends NodeGraph {
getText(): string {
const model = this.getModel();
let result = model.getText();
if (!$defined(result)) {
result = TopicStyle.defaultText(this);
}
return result;
const text = model.getText();
return text || TopicStyle.defaultText(this);
}
setBackgroundColor(color: string): void {
@ -622,7 +618,7 @@ abstract class Topic extends NodeGraph {
}
const shrinkConnector = this.getShrinkConnector();
if ($defined(shrinkConnector)) {
if (shrinkConnector) {
shrinkConnector.addToWorkspace(group);
}
@ -706,7 +702,7 @@ abstract class Topic extends NodeGraph {
EventBus.instance.fireEvent('childShrinked', model);
}
getShrinkConnector(): ShirinkConnector | undefined {
getShrinkConnector(): ShirinkConnector | null {
let result = this._connector;
if (this._connector == null) {
this._connector = new ShirinkConnector(this);
@ -849,10 +845,10 @@ abstract class Topic extends NodeGraph {
.map((node) => node.getOutgoingLine());
}
getOutgoingConnectedTopic(): Topic {
getOutgoingConnectedTopic(): Topic | null {
let result = null;
const line = this.getOutgoingLine();
if ($defined(line)) {
if (line) {
result = line.getTargetTopic();
}
return result;
@ -875,7 +871,7 @@ abstract class Topic extends NodeGraph {
setBranchVisibility(value: boolean): void {
let current: Topic = this;
let parent: Topic = this;
let parent: Topic | null = this;
while (parent != null && !parent.isCentralTopic()) {
current = parent;
parent = current.getParent();
@ -905,7 +901,7 @@ abstract class Topic extends NodeGraph {
this._relationships.forEach((r) => r.moveToBack());
const connector = this.getShrinkConnector();
if ($defined(connector)) {
if (connector) {
connector.moveToBack();
}
@ -916,7 +912,7 @@ abstract class Topic extends NodeGraph {
moveToFront(): void {
this.get2DElement().moveToFront();
const connector = this.getShrinkConnector();
if ($defined(connector)) {
if (connector) {
connector.moveToFront();
}
// Update relationship lines
@ -951,7 +947,7 @@ abstract class Topic extends NodeGraph {
if (this.getIncomingLines().length > 0) {
const connector = this.getShrinkConnector();
if ($defined(connector)) {
if (connector) {
connector.setVisibility(value, fade);
}
}
@ -970,7 +966,7 @@ abstract class Topic extends NodeGraph {
elem.setOpacity(opacity);
const connector = this.getShrinkConnector();
if ($defined(connector)) {
if (connector) {
connector.setOpacity(opacity);
}
const textShape = this.getTextShape();
@ -1132,7 +1128,7 @@ abstract class Topic extends NodeGraph {
// Display connection node...
const connector = targetTopic.getShrinkConnector();
if ($defined(connector)) {
if (connector) {
connector.setVisibility(true);
}
@ -1190,9 +1186,10 @@ abstract class Topic extends NodeGraph {
EventBus.instance.fireEvent('topicAdded', this.getModel());
}
if (this.getModel().isConnected()) {
const outgoingTopic = this.getOutgoingConnectedTopic();
if (this.getModel().isConnected() && outgoingTopic) {
EventBus.instance.fireEvent('topicConnected', {
parentNode: this.getOutgoingConnectedTopic().getModel(),
parentNode: outgoingTopic.getModel(),
childNode: this.getModel(),
});
}
@ -1212,7 +1209,7 @@ abstract class Topic extends NodeGraph {
// Is the node already connected ?
const targetTopic = this.getOutgoingConnectedTopic();
if ($defined(targetTopic)) {
if (targetTopic) {
result.connectTo(targetTopic);
result.setVisibility(false);
}
@ -1265,19 +1262,18 @@ abstract class Topic extends NodeGraph {
}
private _flatten2DElements(topic: Topic): (Topic | Relationship)[] {
let result = [];
const result: (Topic | Relationship)[] = [];
const children = topic.getChildren();
children.forEach((child) => {
result.push(child);
result.push(child.getOutgoingLine());
const relationships = child.getRelationships();
result = result.concat(relationships);
result.push(...relationships);
if (!child.areChildrenShrunken()) {
const innerChilds = this._flatten2DElements(child);
result = result.concat(innerChilds);
result.push(...innerChilds);
}
});
return result;

View File

@ -17,9 +17,9 @@
*/
import { $assert } from '@wisemapping/core-js';
import Events from './Events';
import MultilineTextEditor from './MultilineTextEditor';
import { TopicShape } from './model/INodeModel';
import Topic from './Topic';
import MultitTextEditor from './MultilineTextEditor';
const TopicEvent = {
EDIT: 'editnode',
@ -29,24 +29,18 @@ const TopicEvent = {
class TopicEventDispatcher extends Events {
private _readOnly: boolean;
private _activeEditor: MultilineTextEditor;
private _multilineEditor: MultilineTextEditor;
// eslint-disable-next-line no-use-before-define
static _instance: TopicEventDispatcher;
constructor(readOnly: boolean) {
super();
this._readOnly = readOnly;
this._activeEditor = null;
this._multilineEditor = new MultilineTextEditor();
}
close(update: boolean): void {
if (this.isVisible()) {
this._activeEditor.close(update);
this._activeEditor = null;
const editor = MultitTextEditor.getInstance();
if (editor.isActive()) {
editor.close(update);
}
}
@ -58,7 +52,8 @@ class TopicEventDispatcher extends Events {
$assert(eventType, 'eventType can not be null');
// Close all previous open editor ....
if (this.isVisible()) {
const editor = MultitTextEditor.getInstance();
if (editor.isActive()) {
this.close(false);
}
@ -69,15 +64,14 @@ class TopicEventDispatcher extends Events {
!this._readOnly &&
eventType === TopicEvent.EDIT
) {
this._multilineEditor.show(topic, options ? options.text : null);
this._activeEditor = this._multilineEditor;
editor.show(topic, options ? options.text : '');
} else {
this.fireEvent(eventType, { model, readOnly: this._readOnly });
}
}
isVisible(): boolean {
return this._activeEditor != null && this._activeEditor.isVisible();
return MultitTextEditor.getInstance().isActive();
}
static configure(readOnly: boolean): void {

View File

@ -20,7 +20,7 @@ class TopicFactory {
} else {
$assert(false, `unsupported node type:${type}`);
}
return result;
return result!;
}
}

View File

@ -53,7 +53,15 @@ const TopicFeatureFactory = {
const { icon: Icon } = TopicFeatureFactory._featuresMetadataById.filter(
(elem) => elem.id === model.getType(),
)[0];
return new Icon(topic, model, readOnly);
// Temporal catch to idenfify bug. Please, remove.
let result;
try {
result = new Icon(topic, model, readOnly);
} catch (e) {
throw new Error(`${e} - ${JSON.stringify(model)}`);
}
return result;
},
};

View File

@ -6,9 +6,9 @@ import NoteIcon from './NoteIcon';
import Topic from './Topic';
import { $msg } from './Messages';
class WidgetManager {
abstract class WidgetManager {
// eslint-disable-next-line no-use-before-define
static _instance: WidgetManager;
private static _instance: WidgetManager;
static init = (instance: WidgetManager) => {
this._instance = instance;
@ -18,7 +18,12 @@ class WidgetManager {
return this._instance;
}
private createTooltip(mindmapElement, title, linkModel: LinkModel, noteModel: NoteModel) {
private createTooltip(
mindmapElement,
title: string,
linkModel?: LinkModel,
noteModel?: NoteModel,
) {
const webcomponentShadowRoot = $($('#mindmap-comp')[0].shadowRoot);
let tooltip = webcomponentShadowRoot.find('#mindplot-svg-tooltip');
if (!tooltip.length) {
@ -65,7 +70,8 @@ class WidgetManager {
tooltip.css({ display: 'block' });
evt.stopPropagation();
});
mindmapElement.addEvent('mouseleave', (evt) => {
mindmapElement.addEvent('mouseleave', (evt: MouseEvent) => {
tooltip.css({ display: 'none' });
evt.stopPropagation();
});
@ -75,11 +81,11 @@ class WidgetManager {
this.createTooltip(linkIcon.getElement().peer, $msg('LINK'), linkModel, undefined);
}
createTooltipForNote(topic: Topic, noteModel: NoteModel, noteIcon: NoteIcon) {
createTooltipForNote(topic: Topic, noteModel: NoteModel, noteIcon: NoteIcon): void {
this.createTooltip(noteIcon.getElement().peer, $msg('NOTE'), undefined, noteModel);
}
configureEditorForLink(topic: Topic, linkModel: LinkModel, linkIcon: LinkIcon) {
configureEditorForLink(topic: Topic, linkModel: LinkModel, linkIcon: LinkIcon): void {
const htmlImage = linkIcon.getElement().peer;
htmlImage.addEvent('click', (evt) => {
this.showEditorForLink(topic, linkModel, linkIcon);
@ -87,7 +93,7 @@ class WidgetManager {
});
}
configureEditorForNote(topic: Topic, noteModel: NoteModel, noteIcon: NoteIcon) {
configureEditorForNote(topic: Topic, noteModel: NoteModel, noteIcon: NoteIcon): void {
const htmlImage = noteIcon.getElement().peer;
htmlImage.addEvent('click', (evt) => {
this.showEditorForNote(topic, noteModel, noteIcon);
@ -95,13 +101,17 @@ class WidgetManager {
});
}
showEditorForLink(topic: Topic, linkModel: LinkModel, linkIcon: LinkIcon) {
console.log('Show link editor not yet implemented');
}
abstract showEditorForLink(
topic: Topic,
linkModel: LinkModel | null,
linkIcon: LinkIcon | null,
): void;
showEditorForNote(topic: Topic, noteModel: NoteModel, noteIcon: NoteIcon) {
console.log('Show note editor not yet implemented');
}
abstract showEditorForNote(
topic: Topic,
noteModel: NoteModel | null,
noteIcon: NoteIcon | null,
): void;
}
export default WidgetManager;

View File

@ -35,6 +35,10 @@ class Workspace {
private _visibleAreaSize: SizeType;
private _renderQueue: Element2D[];
private _queueRenderEnabled: boolean;
constructor(screenManager: ScreenManager, zoom: number, isReadOnly: boolean) {
// Create a suitable container ...
$assert(screenManager, 'Div container can not be null');
@ -56,6 +60,16 @@ class Workspace {
// Append to the workspace...
workspace.addItAsChildTo(divContainer);
this.setZoom(zoom, true);
this._renderQueue = [];
}
private _adjustWorkspace(): void {
this.setZoom(this._zoom, false);
}
registerEvents() {
// Register drag events ...
this._registerDragEvents();
this._eventsEnabled = true;
@ -64,12 +78,6 @@ class Workspace {
window.addEventListener('resize', () => {
this._adjustWorkspace();
});
this.setZoom(zoom, true);
}
private _adjustWorkspace(): void {
this.setZoom(this._zoom, false);
}
isReadOnly(): boolean {
@ -97,16 +105,58 @@ class Workspace {
}
append(shape: Element2D): void {
if ($defined(shape.addToWorkspace)) {
if (this._queueRenderEnabled) {
this._renderQueue.push(shape);
} else {
this.appendInternal(shape);
}
}
private appendInternal(shape: Element2D): void {
if (shape.addToWorkspace) {
shape.addToWorkspace(this);
} else {
this._workspace.append(shape);
}
}
enableQueueRender(value: boolean): Promise<void> {
this._queueRenderEnabled = value;
let result = Promise.resolve();
if (!value) {
// eslint-disable-next-line arrow-body-style
result = Workspace.delay(100).then(() => {
return this.processRenderQueue(this._renderQueue.reverse(), 300);
});
}
return result;
}
private static delay(t: number) {
return new Promise((resolve) => setTimeout(resolve, t));
}
private processRenderQueue(renderQueue: Element2D[], batch: number): Promise<void> {
let result: Promise<void>;
if (renderQueue.length > 0) {
result = new Promise((resolve: (queue: Element2D[]) => void) => {
for (let i = 0; i < batch && renderQueue.length > 0; i++) {
const elem = renderQueue.pop();
this.appendInternal(elem);
}
resolve(renderQueue);
}).then((queue) => Workspace.delay(30).then(() => this.processRenderQueue(queue, batch)));
} else {
result = Promise.resolve();
}
return result;
}
removeChild(shape: Element2D): void {
// Element is a node, not a web2d element?
if ($defined(shape.removeFromWorkspace)) {
if (shape.removeFromWorkspace) {
shape.removeFromWorkspace(this);
} else {
this._workspace.removeChild(shape);
@ -132,8 +182,8 @@ class Workspace {
const workspace = this._workspace;
const divContainer = this._screenManager.getContainer();
const containerWidth = divContainer.width();
const containerHeight = divContainer.height();
const containerWidth = divContainer.width()!;
const containerHeight = divContainer.height()!;
const newVisibleAreaSize = { width: containerWidth, height: containerHeight };
// - svg must fit container size
@ -225,7 +275,9 @@ class Workspace {
window.document.body.style.cursor = 'move';
// If I dont ignore touchmove events, browser console shows a lot of errors:
// Unable to preventDefault inside passive event listener invocation.
if (mouseMoveEvent.type !== 'touchmove') mouseMoveEvent.preventDefault();
if (mouseMoveEvent.type !== 'touchmove') {
mouseMoveEvent.preventDefault();
}
// Fire drag event ...
screenManager.fireEvent('update');

Some files were not shown because too many files have changed in this diff Show More