From 932657df6d72616c315243839f272fbfa0b627c0 Mon Sep 17 00:00:00 2001 From: mujiannan Date: Sun, 6 Sep 2020 14:14:15 +0800 Subject: [PATCH] locale: zh-CN --- assets/icon.png | Bin 1541 -> 1452 bytes assets/icon.pptx | Bin 0 -> 36328 bytes capabilities.json | 48 +++++++++++++++++------- src/css/picsScroller.css | 4 +- src/settings.ts | 2 +- src/visual.ts | 44 +++++++++++++++++----- stringResources/zh-CN.json | 7 ++++ stringResources/zh-CN/resources.resjson | 17 +++++++++ 8 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 assets/icon.pptx create mode 100644 stringResources/zh-CN.json create mode 100644 stringResources/zh-CN/resources.resjson diff --git a/assets/icon.png b/assets/icon.png index 1c2db1c9fd5f1b26bd9beb4f638d389f153cf20a..29d46eac23b5ef6919b8b703217f8c77f52bcbe2 100644 GIT binary patch delta 1161 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 literal 0 HcmV?d00001 diff --git a/capabilities.json b/capabilities.json index c93e05b..e6ae99f 100644 --- a/capabilities.json +++ b/capabilities.json @@ -1,64 +1,84 @@ { "dataRoles": [{ "displayName": "urls", + "displayNameKey": "roles-urls-displayName", "name": "urls", "kind": "Grouping", - "description": "Urls of pictures, example: 'http://www.example.com/xx.png'" + "description": "Urls of pictures, example: 'http://www.example.com/xx.png'", + "descriptionKey": "roles-urls-description" }], "objects": { "layout": { "displayName": "layout", + "displayNameKey": "objects-layout-displayName", "properties": { "rowsCount": { "type": { "numeric": true }, "displayName": "rowsCount", - "description": "How many rows?" + "displayNameKey": "objects-layout-rowsCount-displayName", + "description": "How many rows?", + "descriptionKey": "objects-layout-rowsCount-descriptionKey" }, "rowGap": { "type": { "numeric": true }, "placeHolderText": "{value}%", - "displayName": "rowGap", - "description": "The distance moved during each cycle.(%)" + "displayName": "rowGap(%)", + "displayNameKey": "objects-layout-rowGap-displayName", + "description": "The distance moved during each cycle.(%)", + "descriptionKey": "objects-layout-rowGap-descriptionKey" + }, "columnGap": { "type": { "numeric": true }, "placeHolderText": "msec", - "displayName": "columnGap", - "description": "How long a cycle takes? (msec)" + "displayName": "columnGap(%)", + "displayNameKey": "objects-layout-columnGap-displayName", + "description": "How long a cycle takes? (msec)", + "descriptionKey": "objects-layout-columnGap-descriptionKey" } - } }, "animation": { "displayName": "animation", + "displayNameKey": "objects-animation-displayName", "properties": { - "feet": { + "stepLength": { "type": { "numeric": true }, - "placeHolderText": "{value}%", - "displayName": "feet", - "description": "The distance moved during each cycle.(%)" + "displayName": "stepLength(%)", + "displayNameKey": "objects-animation-stepLength-displayName", + "description": "The distance moved during each cycle.(%)", + "descriptionKey": "objects-animation-stepLength-descriptionKey" + }, "interval": { "type": { "numeric": true }, "placeHolderText": "numeric", - "displayName": "interval", - "description": "How long a cycle takes? (msec)" - } + "displayName": "interval(msec)", + "displayNameKey": "objects-animation-interval-displayName", + "description": "How long a cycle takes? (msec)", + "descriptionKey": "objects-animation-interval-descriptionKey" + } } } }, "dataViewMappings": [{ + "conditions": [{ + "urls": { + "min": 1, + "max": 1 + } + }], "categorical": { "categories": { "for": { diff --git a/src/css/picsScroller.css b/src/css/picsScroller.css index 95c1fca..282340d 100644 --- a/src/css/picsScroller.css +++ b/src/css/picsScroller.css @@ -5,12 +5,12 @@ div.pics-sroller-inner-container { display: flex; flex-direction: column; overflow: hidden; + margin: 0px; } div.pics-scroller-row-container { width: 100%; - overflow-x: hidden; - overflow-y: nowrap; + overflow: hidden; white-space: nowrap; display: flex; flex-direction: row; diff --git a/src/settings.ts b/src/settings.ts index b5ce74b..09fc6bb 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -35,7 +35,7 @@ export class VisualSettings extends DataViewObjectsParser { } export class AnimationSettings { - public feet:number=1;//n% * width + public stepLength:number=1;//n% * width public interval:number=20;//ms } export class LayoutSettings{ diff --git a/src/visual.ts b/src/visual.ts index 7bd169a..f3481ed 100644 --- a/src/visual.ts +++ b/src/visual.ts @@ -38,7 +38,7 @@ import DataView = powerbi.DataView; import VisualObjectInstanceEnumerationObject = powerbi.VisualObjectInstanceEnumerationObject; import { VisualSettings } from "./settings"; -import { timeout } from "d3"; +import * as d3 from "d3"; export interface IPicsScrollerData { @@ -47,10 +47,22 @@ export interface IPicsScrollerData { export class Visual implements IVisual { private container: HTMLElement; private settings: VisualSettings; + private host:powerbi.extensibility.visual.IVisualHost; + private selectionManager: powerbi.extensibility.ISelectionManager; private innerContainer!: HTMLDivElement; private animationPlaying: boolean = true;//控制动画暂停 constructor(options: VisualConstructorOptions) { this.container = options.element; + this.host=options.host; + this.selectionManager=this.host.createSelectionManager(); + d3.select(this.container).on("contextmenu", () => { + const mouseEvent: MouseEvent = d3.event; + this.selectionManager.showContextMenu({}, { + x: mouseEvent.clientX, + y: mouseEvent.clientY + }); + mouseEvent.preventDefault(); + }); } private initial() { if (this.innerContainer) { @@ -61,16 +73,29 @@ export class Visual implements IVisual { this.container.appendChild(this.innerContainer); } public update(options: VisualUpdateOptions) { - this.settings = Visual.parseSettings(options && options.dataViews && options.dataViews[0]); + let settings = Visual.parseSettings(options && options.dataViews && options.dataViews[0]); + this.settings=settings; this.initial(); + //处理输入 let data: IPicsScrollerData = { urls: options.dataViews[0].categorical.categories[0].values }; - let feet = options.viewport.width / 100 * this.settings.animation.feet; + //feet + settings.animation.stepLength=(settings.animation.stepLength>=0&&settings.animation.stepLength<=100)?settings.animation.stepLength:1; + let feet = options.viewport.width / 100 * settings.animation.stepLength; + //interval + settings.animation.interval=settings.animation.interval>0?settings.animation.interval:100; let interval = this.settings.animation.interval; - let rowGap = options.viewport.height / 100 * this.settings.layout.rowGap; + //rowGap + settings.layout.rowGap=(settings.layout.rowGap>=0&&settings.layout.rowGap<=100)?settings.layout.rowGap:0; + let rowGap = options.viewport.height / 100 * settings.layout.rowGap; + //columnGap + settings.layout.columnGap=(settings.layout.columnGap>=0&&settings.layout.columnGap<=100)?settings.layout.columnGap:0; let columnGap = options.viewport.width / 100 * this.settings.layout.columnGap; + + //rowsCount + settings.layout.rowsCount=settings.layout.rowsCount>=1?Math.floor(settings.layout.rowsCount):1; let rowsCount=this.settings.layout.rowsCount; - //处理输入 + if (!(data.urls.length > 0) || !(rowsCount! > 0)) { console.info("picsScroller error: (source_url.length,rowsCount) ", data.urls.length + "_" + rowsCount); return; @@ -91,14 +116,15 @@ export class Visual implements IVisual { let rowContainer = document.createElement('div'); this.innerContainer.appendChild(rowContainer); rowContainer.classList.add('pics-scroller-row-container'); - if (rowNum > 0) { - rowContainer.style.marginTop = rowGap + "px"; - }; + rowContainer.setAttribute('id', 'pics-scroller-row-container' + rowNum); rowContainer.setAttribute("style", "height:" + 100 / rowsCount + "%;"); rowContainer.setAttribute("data-animation-playing", 'false'); rowContainer.setAttribute("data-display-placehold", "false"); - + //Add rowGap + if (rowNum > 0) { + rowContainer.style.marginTop = rowGap + "px"; + }; //双倍图片容器,第一组用来显示,第二组放上去暂时隐藏 //如果第一组发生了溢出,就显示出第二组并应用滚动动画 for (let i = 0; i < 2; i++) { diff --git a/stringResources/zh-CN.json b/stringResources/zh-CN.json new file mode 100644 index 0000000..7cf0a72 --- /dev/null +++ b/stringResources/zh-CN.json @@ -0,0 +1,7 @@ +{ + "locale": "zh-CN", + "values": { + "roles-urls-displayName": "图片url", + "roles-urls-description": "图片的url,例如:'http://www.example.com/xx.png'" + } +} \ No newline at end of file diff --git a/stringResources/zh-CN/resources.resjson b/stringResources/zh-CN/resources.resjson new file mode 100644 index 0000000..fdf0cb6 --- /dev/null +++ b/stringResources/zh-CN/resources.resjson @@ -0,0 +1,17 @@ +{ + "roles-urls-displayName": "图片url", + "roles-urls-description": "图片的url,例如:'http://www.example.com/xx.png'", + "objects-layout-displayName": "布局", + "objects-layout-rowsCount-displayName": "行数", + "objects-layout-rowsCount-descriptionKey": "需要排列为几行?", + "objects-layout-rowGap-displayName": "行间距", + "objects-layout-rowGap-descriptionKey": "按视觉对象高度的百分比(%)", + "objects-layout-columnGap-displayName": "列间距", + "objects-layout-columnGap-descriptionKey": "按视觉对象宽度的百分比(%)", + "objects-animation-displayName": "动画", + "objects-animation-stepLength-displayName": "步长(%)", + "objects-animation-stepLength-descriptionKey": "每个周期内滚动的长度占视觉对象宽度的百分比(%)", + "objects-animation-interval-displayName": "周期(毫秒)", + "objects-animation-interval-descriptionKey": "滚动的间隔,单位(毫秒)" + +} \ No newline at end of file