From 6b46d653006128ad1934a090da45235a2641b5de Mon Sep 17 00:00:00 2001 From: edsilv Date: Fri, 7 Aug 2015 19:26:30 +0100 Subject: [PATCH] extensions use getExternalResources --- .gitignore | 1 + .travis.yml | 2 +- Gruntfile.js | 130 +++++++----------- bower.json | 3 +- config.js | 45 ++++++ package.json | 4 +- src/app.ts | 2 + .../uv-mediaelement-extension/Extension.ts | 46 +------ src/extensions/uv-pdf-extension/Extension.ts | 17 +-- .../uv-seadragon-extension/EmbedDialogue.ts | 1 - .../uv-seadragon-extension/Extension.ts | 44 +----- .../ISeadragonProvider.ts | 12 +- .../uv-seadragon-extension/Provider.ts | 62 ++++----- src/lib/http-status-codes.js | 59 ++++++++ src/lib/manifesto.js | 52 ++++--- .../uv-dialogues-module/EmbedDialogue.ts | 4 +- .../MediaElementCenterPanel.ts | 17 +-- .../PagingHeaderPanel.ts | 4 +- .../PDFCenterPanel.ts | 63 +++++---- .../SeadragonCenterPanel.ts | 45 +++--- .../FooterPanel.ts | 12 +- src/modules/uv-shared-module/BaseExtension.ts | 99 +++++++++---- src/modules/uv-shared-module/BaseProvider.ts | 27 +--- src/modules/uv-shared-module/BaseView.ts | 6 +- .../{Resource.ts => ExternalResource.ts} | 35 +++-- src/modules/uv-shared-module/FooterPanel.ts | 2 +- src/modules/uv-shared-module/HeaderPanel.ts | 2 +- src/modules/uv-shared-module/IExtension.ts | 23 ++-- src/modules/uv-shared-module/IProvider.ts | 31 +++-- .../GalleryView.ts | 5 +- .../uv-treeviewleftpanel-module/ThumbsView.ts | 5 +- .../uv-treeviewleftpanel-module/TreeView.ts | 6 +- src/typings/http-status-codes.d.ts | 58 ++++++++ src/typings/manifesto.d.ts | 5 +- 34 files changed, 521 insertions(+), 408 deletions(-) create mode 100644 config.js create mode 100644 src/lib/http-status-codes.js rename src/modules/uv-shared-module/{Resource.ts => ExternalResource.ts} (70%) create mode 100644 src/typings/http-status-codes.d.ts diff --git a/.gitignore b/.gitignore index d0397896f..6372651bc 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ node_modules *.js.map *.min.map !tasks/*.js +!config.js !Gruntfile.js !src/lib/*.js !src/*/*/lib/*.js diff --git a/.travis.yml b/.travis.yml index 260d384df..955351925 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,4 @@ install: - npm install - bower install script: -- grunt build \ No newline at end of file +- grunt build diff --git a/Gruntfile.js b/Gruntfile.js index 344c7d923..f8fcf37bc 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,6 +1,8 @@ var version = require('./tasks/version'); var configure = require('./tasks/configure'); var theme = require('./tasks/theme'); +var c = require('./config'); +var config = new c(); module.exports = function (grunt) { @@ -8,24 +10,14 @@ module.exports = function (grunt) { function refresh() { packageJson = grunt.file.readJSON("package.json"); - grunt.config.set('dirs.uv', 'uv-' + packageJson.version); + grunt.config.set('config.dirs.uv', 'uv-' + packageJson.version); } refresh(); grunt.initConfig({ - dirs: { - bower: './lib', - build: './build', - dist: './dist', - examples: './examples', - extensions: './src/extensions', - lib: './src/lib', - modules: './src/modules', - themes: './src/themes', - typings: './src/typings' - }, + config: config, global: { @@ -36,38 +28,14 @@ module.exports = function (grunt) { pkg: packageJson, typescript: { - dev: { - src: [ - //'./src/_Version.ts', - //'./src/*.ts', - './src/**/*.ts' - ], - options: { - target: 'es3', - module: 'amd', - sourceMap: true, - declarations: false, - nolib: false, - comments: true - } - }, - build: { - src: ["src/**/*.ts"], - options: { - target: 'es3', - module: 'amd', - sourceMap: false, - declarations: false, - nolib: false, - comments: false - } - } + dev: config.typescript.dev, + dist: config.typescript.dist }, clean: { - build : ['<%= dirs.build %>'], - dist: ['<%= dirs.dist %>'], - examples: ['<%= dirs.examples %>/uv-*'], + build : ['<%= config.dirs.build %>'], + dist: ['<%= config.dirs.dist %>'], + examples: ['<%= config.dirs.examples %>/uv-*'], extension: ['./src/extensions/*/build/*'] }, @@ -78,7 +46,7 @@ module.exports = function (grunt) { { expand: true, src: ['src/extensions/*/build/*.schema.json'], - dest: '<%= dirs.build %>/schema/', + dest: '<%= config.dirs.build %>/schema/', rename: function(dest, src) { // get the extension name from the src string. // src/extensions/[extension]/build/[locale].schema.json @@ -99,21 +67,21 @@ module.exports = function (grunt) { flatten: true, cwd: 'src', src: ['app.html'], - dest: '<%= dirs.build %>' + dest: '<%= config.dirs.build %>' }, // js { expand: true, flatten: true, - cwd: '<%= dirs.lib %>', + cwd: '<%= config.dirs.lib %>', src: ['embed.js', 'easyXDM.min.js', 'easyxdm.swf', 'json2.min.js', 'require.js', 'l10n.js', 'base64.min.js'], - dest: '<%= dirs.build %>/lib/' + dest: '<%= config.dirs.build %>/lib/' }, // extension configuration files { expand: true, src: ['src/extensions/**/build/*.config.json'], - dest: '<%= dirs.build %>/lib/', + dest: '<%= config.dirs.build %>/lib/', rename: function(dest, src) { // get the extension name from the src string. @@ -129,7 +97,7 @@ module.exports = function (grunt) { { expand: true, src: ['src/extensions/**/dependencies.js'], - dest: '<%= dirs.build %>/lib/', + dest: '<%= config.dirs.build %>/lib/', rename: function(dest, src) { // get the extension name from the src string. @@ -144,7 +112,7 @@ module.exports = function (grunt) { expand: true, flatten: true, src: ['src/extensions/**/lib/*'], - dest: '<%= dirs.build %>/lib/' + dest: '<%= config.dirs.build %>/lib/' }, // l10n localisation files { @@ -152,7 +120,7 @@ module.exports = function (grunt) { flatten: false, cwd: 'src/modules/', src: ['**/l10n/**/*.properties'], - dest: '<%= dirs.build %>/l10n/', + dest: '<%= config.dirs.build %>/l10n/', rename: function(dest, src) { // get the locale and .properties files. var reg = /.*\/l10n\/(.*)/; @@ -165,7 +133,7 @@ module.exports = function (grunt) { { expand: true, src: ['src/modules/**/html/*'], - dest: '<%= dirs.build %>/html/', + dest: '<%= config.dirs.build %>/html/', rename: function(dest, src) { var fileName = src.substr(src.lastIndexOf('/')); @@ -183,17 +151,17 @@ module.exports = function (grunt) { // copy contents of /build to /examples/build. files: [ { - cwd: '<%= dirs.build %>', + cwd: '<%= config.dirs.build %>', expand: true, src: ['**'], - dest: '<%= dirs.examples %>/<%= dirs.uv %>/' + dest: '<%= config.dirs.examples %>/<%= config.dirs.uv %>/' }, // misc { expand: true, flatten: true, src: ['favicon.ico'], - dest: '<%= dirs.examples %>/' + dest: '<%= config.dirs.examples %>/' } ] } @@ -204,53 +172,55 @@ module.exports = function (grunt) { files: [ { // extensions - cwd: '<%= dirs.bower %>', + cwd: '<%= config.dirs.bower %>', expand: true, src: ['uv-*-extension/**'], - dest: '<%= dirs.extensions %>' + dest: '<%= config.dirs.extensions %>' }, { // modules - cwd: '<%= dirs.bower %>', + cwd: '<%= config.dirs.bower %>', expand: true, src: ['uv-*-module/**'], - dest: '<%= dirs.modules %>' + dest: '<%= config.dirs.modules %>' }, { // themes - cwd: '<%= dirs.bower %>', + cwd: '<%= config.dirs.bower %>', expand: true, src: ['uv-*-theme/**'], - dest: '<%= dirs.themes %>' + dest: '<%= config.dirs.themes %>' }, { // all files that need to be copied from /lib to /src/lib post bower install - cwd: '<%= dirs.bower %>', + cwd: '<%= config.dirs.bower %>', expand: true, flatten: true, src: [ 'es6-promise/promise.min.js', 'extensions/dist/extensions.js', + 'http-status-codes/dist/http-status-codes.js', 'jquery-plugins/dist/jquery-plugins.js', 'lodash-compat/lodash.min.js', 'manifesto/dist/client/manifesto.js', 'Units/Length.min.js', 'utils/dist/utils.js' ], - dest: '<%= dirs.lib %>' + dest: '<%= config.dirs.lib %>' }, { // all files that need to be copied from /lib to /src/typings post bower install - cwd: '<%= dirs.bower %>', + cwd: '<%= config.dirs.bower %>', expand: true, flatten: true, src: [ 'extensions/typings/extensions.d.ts', + 'http-status-codes/dist/http-status-codes.d.ts', 'jquery-plugins/typings/jquery-plugins.d.ts', 'manifesto/dist/manifesto.d.ts', 'utils/dist/utils.d.ts' ], - dest: '<%= dirs.typings %>' + dest: '<%= config.dirs.typings %>' } ] } @@ -260,13 +230,13 @@ module.exports = function (grunt) { zip: { options: { mode: 'zip', - archive: '<%= dirs.dist %>/<%= dirs.uv %>.zip', + archive: '<%= config.dirs.dist %>/<%= config.dirs.uv %>.zip', level: 9 }, files: [ { expand: true, - cwd: '<%= dirs.build %>/', + cwd: '<%= config.dirs.build %>/', src: ['**'] } ] @@ -274,12 +244,12 @@ module.exports = function (grunt) { tar: { options: { mode: 'tar', - archive: '<%= dirs.dist %>/<%= dirs.uv %>.tar' + archive: '<%= config.dirs.dist %>/<%= config.dirs.uv %>.tar' }, files: [ { expand: true, - cwd: '<%= dirs.build %>/', + cwd: '<%= config.dirs.build %>/', src: ['**'] } ] @@ -289,14 +259,14 @@ module.exports = function (grunt) { exec: { // concatenate and compress with r.js build: { - cmd: 'node lib/r.js/dist/r.js -o baseUrl=src/ mainConfigFile=src/app.js name=app <%= global.minify %> out=<%= dirs.build %>/lib/app.js' + cmd: 'node lib/r.js/dist/r.js -o baseUrl=src/ mainConfigFile=src/app.js name=app <%= global.minify %> out=<%= config.dirs.build %>/lib/app.js' } }, replace: { html: { - src: ['<%= dirs.build %>/app.html'], + src: ['<%= config.dirs.build %>/app.html'], overwrite: true, replacements: [{ from: 'data-main="app"', @@ -306,7 +276,7 @@ module.exports = function (grunt) { js: { // replace window.DEBUG=true // todo: use a compiler flag when available - src: ['<%= dirs.build %>/lib/app.js'], + src: ['<%= config.dirs.build %>/lib/app.js'], overwrite: true, replacements: [{ from: /window.DEBUG.*=.*true;/g, @@ -318,7 +288,7 @@ module.exports = function (grunt) { // ../../img/[module]/[image] moduleimages: { // replace img srcs to point to "../../img/[module]/[img]" - src: ['<%= dirs.build %>/themes/*/css/*/theme.css'], + src: ['<%= config.dirs.build %>/themes/*/css/*/theme.css'], overwrite: true, replacements: [{ from: /\((?:'|"|)(?:.*modules\/(.*)\/img\/(.*.\w{3,}))(?:'|"|)\)/g, @@ -330,7 +300,7 @@ module.exports = function (grunt) { // ../../../img/[img] themeimages: { // replace img srcs to point to "../../img/[module]/[img]" - src: ['<%= dirs.build %>/themes/*/css/*/theme.css'], + src: ['<%= config.dirs.build %>/themes/*/css/*/theme.css'], overwrite: true, replacements: [{ from: /\((?:'|"|)(?:.*themes\/(.*)\/img\/(.*.\w{3,}))(?:'|"|)\)/g, @@ -340,16 +310,16 @@ module.exports = function (grunt) { examples: { // replace uv version src: [ - '<%= dirs.examples %>/index.html', - '<%= dirs.examples %>/noeditor.html', - '<%= dirs.examples %>/examples.js', - '<%= dirs.examples %>/uv.js', - '<%= dirs.examples %>/web.config' + '<%= config.dirs.examples %>/index.html', + '<%= config.dirs.examples %>/noeditor.html', + '<%= config.dirs.examples %>/examples.js', + '<%= config.dirs.examples %>/uv.js', + '<%= config.dirs.examples %>/web.config' ], overwrite: true, replacements: [{ from: /uv-\d+\.\d+\.\d+/g, - to: '<%= dirs.uv %>' + to: '<%= config.dirs.uv %>' }] } }, @@ -362,7 +332,7 @@ module.exports = function (grunt) { directory: '.', keepalive: true, open: { - target: 'http://localhost:<%= global.port %>/<%= dirs.examples %>/' + target: 'http://localhost:<%= global.port %>/<%= config.dirs.examples %>/' } } } @@ -449,7 +419,7 @@ module.exports = function (grunt) { if (minify) grunt.config.set('global.minify', ''); grunt.task.run( - 'typescript:build', + 'typescript:dist', 'clean:extension', 'configure:apply', 'clean:build', diff --git a/bower.json b/bower.json index 54662cdb6..0adc024c9 100644 --- a/bower.json +++ b/bower.json @@ -19,11 +19,12 @@ "dependencies": { "es6-promise": "~2.2.0", "extensions": "edsilv/extensions#~0.1.5", + "http-status-codes": "edsilv/http-status-codes#~0.0.2", "jquery-plugins": "edsilv/jquery-plugins#~0.0.14", "utils": "edsilv/utils#~0.0.23", "uv-cy-GB-theme": "UniversalViewer/uv-cy-GB-theme", "uv-en-GB-theme": "UniversalViewer/uv-en-GB-theme", - "manifesto": "~0.1.11", + "manifesto": "edsilv/manifesto#dev", "lodash-compat": "~3.10.0" }, "devDependencies": { diff --git a/config.js b/config.js new file mode 100644 index 000000000..f830e92b0 --- /dev/null +++ b/config.js @@ -0,0 +1,45 @@ +var metadata = require('./package'); + +var Config = (function () { + function Config() { + this.header = '// ' + metadata.name + ' v' + metadata.version + ' ' + metadata.homepage + '\n'; + this.dirs = { + bower: './lib', + build: './build', + dist: './dist', + examples: './examples', + extensions: './src/extensions', + lib: './src/lib', + modules: './src/modules', + themes: './src/themes', + typings: './src/typings' + }; + this.typescript = { + dev: { + src: ['./src/**/*.ts'], + options: { + target: 'es3', + module: 'amd', + sourceMap: true, + declarations: false, + nolib: false, + comments: true + } + }, + dist: { + src: ['./src/**/*.ts'], + options: { + target: 'es3', + module: 'amd', + sourceMap: false, + declarations: false, + nolib: false, + comments: false + } + } + }; + } + return Config; +})(); + +module.exports = Config; \ No newline at end of file diff --git a/package.json b/package.json index 69d0c96f4..e87574b62 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ "grunt-sync": "^0.2.3", "grunt-text-replace": "~0.3.7", "grunt-typescript": "^0.6.2", + "gulp": "^3.9.0", + "gulp-typescript": "^2.8.0", "hooker": "^0.2.3", "json-schema-generator": "git://github.com/krg7880/json-schema-generator.git", "less": "^2.4.0", @@ -25,4 +27,4 @@ "ncp": "^2.0.0", "protractor": "1.3.1" } -} \ No newline at end of file +} diff --git a/src/app.ts b/src/app.ts index 4e99a0855..f8e03eadd 100644 --- a/src/app.ts +++ b/src/app.ts @@ -3,6 +3,7 @@ require.config({ 'browserdetect': 'lib/browserdetect', 'promise': 'lib/promise.min', 'ext': 'lib/extensions', + 'httpstatuscodes': 'lib/http-status-codes', 'jquery': 'lib/jquery-1.10.2.min', 'jsviews': 'lib/jsviews.min', 'l10n': 'lib/l10n', @@ -50,6 +51,7 @@ require([ 'manifesto', 'browserdetect', 'ext', + 'httpstatuscodes', 'jquery', 'jsviews', 'l10n', diff --git a/src/extensions/uv-mediaelement-extension/Extension.ts b/src/extensions/uv-mediaelement-extension/Extension.ts index 3585463f1..c77d6422b 100644 --- a/src/extensions/uv-mediaelement-extension/Extension.ts +++ b/src/extensions/uv-mediaelement-extension/Extension.ts @@ -14,7 +14,7 @@ import MediaElementCenterPanel = require("../../modules/uv-mediaelementcenterpan import MoreInfoRightPanel = require("../../modules/uv-moreinforightpanel-module/MoreInfoRightPanel"); import Params = require("../../modules/uv-shared-module/Params"); import Provider = require("./Provider"); -import Resource = require("../../modules/uv-shared-module/Resource"); +import ExternalResource = require("../../modules/uv-shared-module/ExternalResource"); import RightPanel = require("../../modules/uv-shared-module/RightPanel"); import SettingsDialogue = require("./SettingsDialogue"); import Shell = require("../../modules/uv-shared-module/Shell"); @@ -54,9 +54,9 @@ class Extension extends BaseExtension{ $.publish(BaseCommands.TOGGLE_FULLSCREEN); }); - $.subscribe(Commands.TREE_NODE_SELECTED, (e, data: any) => { - this.viewManifest(data); - }); + //$.subscribe(Commands.TREE_NODE_SELECTED, (e, data: any) => { + // this.viewManifest(data); + //}); $.subscribe(BaseCommands.DOWNLOAD, (e) => { $.publish(BaseCommands.SHOW_DOWNLOAD_DIALOGUE); @@ -66,8 +66,8 @@ class Extension extends BaseExtension{ $.publish(BaseCommands.SHOW_EMBED_DIALOGUE); }); - $.subscribe(BaseCommands.THUMB_SELECTED, (e, index: number) => { - this.viewFile(index); + $.subscribe(BaseCommands.THUMB_SELECTED, (e, canvasIndex: number) => { + this.viewCanvas(canvasIndex); }); $.subscribe(BaseCommands.LEFTPANEL_EXPAND_FULL_START, (e) => { @@ -128,40 +128,6 @@ class Extension extends BaseExtension{ return Utils.Bools.GetBool(this.provider.config.options.leftPanelEnabled, true) && (this.provider.isMultiCanvas() || this.provider.isMultiSequence()); } - - viewFile(canvasIndex: number): void { - - // if it's a valid canvas index. - if (canvasIndex === -1) return; - - this.viewCanvas(canvasIndex, () => { - var canvas = this.provider.getCanvasByIndex(canvasIndex); - $.publish(BaseCommands.OPEN_MEDIA, [canvas]); - this.setParam(Params.canvasIndex, canvasIndex); - }); - - } - - getMedia(element: Manifesto.IElement): Promise { - var resource: Manifesto.IExternalResource = new Resource(this.provider); - - var ixifService = element.getService(manifesto.ServiceProfile.ixif()); - - resource.dataUri = ixifService.getInfoUri(); - - return new Promise((resolve) => { - (this.provider).manifest.loadResource( - resource, - this.clickThrough, - this.login, - this.getAccessToken, - this.storeAccessToken, - this.getStoredAccessToken, - this.handleResourceResponse).then((resource: Manifesto.IExternalResource) => { - resolve(resource); - }); - }); - } } export = Extension; diff --git a/src/extensions/uv-pdf-extension/Extension.ts b/src/extensions/uv-pdf-extension/Extension.ts index dc1d40b2e..448fdc5f3 100644 --- a/src/extensions/uv-pdf-extension/Extension.ts +++ b/src/extensions/uv-pdf-extension/Extension.ts @@ -42,8 +42,8 @@ class Extension extends BaseExtension{ create(overrideDependencies?: any): void { super.create(); - $.subscribe(BaseCommands.THUMB_SELECTED, (e, index: number) => { - this.viewFile(index); + $.subscribe(BaseCommands.THUMB_SELECTED, (e, canvasIndex: number) => { + this.viewCanvas(canvasIndex); }); $.subscribe(BaseCommands.LEFTPANEL_EXPAND_FULL_START, (e) => { @@ -123,19 +123,6 @@ class Extension extends BaseExtension{ this.rightPanel.init(); } } - - viewFile(canvasIndex: number): void { - - // if it's a valid canvas index. - if (canvasIndex == -1) return; - - this.viewCanvas(canvasIndex, () => { - var canvas = this.provider.getCanvasByIndex(canvasIndex); - $.publish(BaseCommands.OPEN_MEDIA, [canvas]); - this.setParam(Params.canvasIndex, canvasIndex); - }); - - } } export = Extension; diff --git a/src/extensions/uv-seadragon-extension/EmbedDialogue.ts b/src/extensions/uv-seadragon-extension/EmbedDialogue.ts index db2b6c1f7..63304de67 100644 --- a/src/extensions/uv-seadragon-extension/EmbedDialogue.ts +++ b/src/extensions/uv-seadragon-extension/EmbedDialogue.ts @@ -41,7 +41,6 @@ class EmbedDialogue extends BaseEmbedDialogue { resize(): void { super.resize(); - } } diff --git a/src/extensions/uv-seadragon-extension/Extension.ts b/src/extensions/uv-seadragon-extension/Extension.ts index 220ac1aa1..b5a7e2291 100644 --- a/src/extensions/uv-seadragon-extension/Extension.ts +++ b/src/extensions/uv-seadragon-extension/Extension.ts @@ -16,7 +16,7 @@ import Mode = require("./Mode"); import MoreInfoRightPanel = require("../../modules/uv-moreinforightpanel-module/MoreInfoRightPanel"); import PagingHeaderPanel = require("../../modules/uv-pagingheaderpanel-module/PagingHeaderPanel"); import Params = require("../../modules/uv-shared-module/Params"); -import Resource = require("../../modules/uv-shared-module/Resource"); +import ExternalResource = require("../../modules/uv-shared-module/ExternalResource"); import RightPanel = require("../../modules/uv-shared-module/RightPanel"); import SeadragonCenterPanel = require("../../modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel"); import Settings = require("../../modules/uv-shared-module/Settings"); @@ -41,7 +41,6 @@ class Extension extends BaseExtension { footerPanel: FooterPanel; headerPanel: PagingHeaderPanel; helpDialogue: HelpDialogue; - isLoading: boolean = false; leftPanel: TreeViewLeftPanel; mode: Mode; rightPanel: MoreInfoRightPanel; @@ -165,7 +164,7 @@ class Extension extends BaseExtension { }); $.subscribe(Commands.SEADRAGON_OPEN, () => { - this.isLoading = false; + }); $.subscribe(Commands.SEADRAGON_ROTATION, (e, rotation) => { @@ -246,53 +245,20 @@ class Extension extends BaseExtension { viewPage(canvasIndex: number, isReload?: boolean): void { - // todo: stopgap until this issue is resolved: https://github.com/openseadragon/openseadragon/issues/629 - if (this.isLoading){ - return; - } - // if it's a valid canvas index. if (canvasIndex === -1) return; - this.isLoading = true; - if (this.provider.isPagingSettingEnabled() && !isReload){ var indices = this.provider.getPagedIndices(canvasIndex); // if the page is already displayed, only advance canvasIndex. if (indices.contains(this.provider.canvasIndex)) { - this.viewCanvas(canvasIndex, () => { - this.setParam(Params.canvasIndex, canvasIndex); - }); - - this.isLoading = false; + this.viewCanvas(canvasIndex); return; } } - this.viewCanvas(canvasIndex, () => { - var canvas = this.provider.getCanvasByIndex(canvasIndex); - var uri = (this.provider).getInfoUri(canvas); - $.publish(BaseCommands.OPEN_MEDIA, [uri]); - this.setParam(Params.canvasIndex, canvasIndex); - }); - - } - - getImages(): Promise { - return new Promise((resolve) => { - (this.provider).getImages( - this.clickThrough, - this.login, - this.getAccessToken, - this.storeAccessToken, - this.getStoredAccessToken, - this.handleResourceResponse).then((images: Manifesto.IExternalResource[]) => { - resolve(images); - })['catch']((errorMessage) => { - this.showMessage(errorMessage); - }); - }); + this.viewCanvas(canvasIndex); } getViewer() { @@ -368,7 +334,7 @@ class Extension extends BaseExtension { if (!data.type) return; if (data.type === 'manifest') { - this.viewManifest(data); + //this.viewManifest(data); } else { this.viewRange(data.path); } diff --git a/src/extensions/uv-seadragon-extension/ISeadragonProvider.ts b/src/extensions/uv-seadragon-extension/ISeadragonProvider.ts index 89a0f4552..0b5b6a0ee 100644 --- a/src/extensions/uv-seadragon-extension/ISeadragonProvider.ts +++ b/src/extensions/uv-seadragon-extension/ISeadragonProvider.ts @@ -1,5 +1,5 @@ import IProvider = require("../../modules/uv-shared-module/IProvider"); -import Resource = require("../../modules/uv-shared-module/Resource"); +import ExternalResource = require("../../modules/uv-shared-module/ExternalResource"); import SearchResult = require("./SearchResult"); interface ISeadragonProvider extends IProvider{ @@ -8,17 +8,11 @@ interface ISeadragonProvider extends IProvider{ getConfinedImageUri(canvas: Manifesto.ICanvas, width: number, height?: number): string; getCroppedImageUri(canvas: Manifesto.ICanvas, viewer: any, download?: boolean, relativeUri?: boolean): string; getEmbedScript(canvasIndex: number, zoom: string, width: number, height: number, rotation: number, embedTemplate: string): string; - getImages(clickThrough: (resource: Manifesto.IExternalResource) => void, - login: (loginService: string) => Promise, - getAccessToken: (tokenServiceUrl: string) => Promise, - storeAccessToken: (resource: Manifesto.IExternalResource, token: Manifesto.IAccessToken) => Promise, - getStoredAccessToken: (tokenService: string) => Promise, - handleResourceResponse: (resource: Manifesto.IExternalResource) => Promise): Promise; - getInfoUri(canvas: Manifesto.ICanvas): string; + getImageBaseUri(canvas: Manifesto.ICanvas): string; + getImageId(canvas: Manifesto.ICanvas): string; getSearchResultByCanvasIndex(index: number): SearchResult; getSearchWithinService(): Manifesto.IService; getSearchWithinServiceUri(): string; - images: Manifesto.IExternalResource[]; isSearchWithinEnabled(): boolean; parseSearchWithinResults(results: any); searchResults: SearchResult[]; diff --git a/src/extensions/uv-seadragon-extension/Provider.ts b/src/extensions/uv-seadragon-extension/Provider.ts index 85ecf9356..89a80ab31 100644 --- a/src/extensions/uv-seadragon-extension/Provider.ts +++ b/src/extensions/uv-seadragon-extension/Provider.ts @@ -3,11 +3,10 @@ import BaseProvider = require("../../modules/uv-shared-module/BaseProvider"); import ISeadragonProvider = require("./ISeadragonProvider"); import SearchResult = require("./SearchResult"); import SearchResultRect = require("./SearchResultRect"); -import Resource = require("../../modules/uv-shared-module/Resource"); +import ExternalResource = require("../../modules/uv-shared-module/ExternalResource"); class Provider extends BaseProvider implements ISeadragonProvider{ - images: Manifesto.IExternalResource[]; searchResults: SearchResult[] = []; constructor(bootstrapper: BootStrapper) { @@ -89,7 +88,7 @@ class Provider extends BaseProvider implements ISeadragonProvider{ return uri; } - getConfinedImageUri(canvas: any, width: number, height?: number): string { + getConfinedImageUri(canvas: Manifesto.ICanvas, width: number, height?: number): string { var baseUri = this.getImageBaseUri(canvas); // {baseuri}/{id}/{region}/{size}/{rotation}/{quality}.jpg @@ -109,21 +108,21 @@ class Provider extends BaseProvider implements ISeadragonProvider{ return uri; } - getImageId(canvas: any): string { + getImageId(canvas: Manifesto.ICanvas): string { var id = this.getInfoUri(canvas); // First trim off info.json, then extract ID: id = id.substr(0, id.lastIndexOf("/")); return id.substr(id.lastIndexOf("/") + 1); } - getImageBaseUri(canvas: any): string { + getImageBaseUri(canvas: Manifesto.ICanvas): string { var uri = this.getInfoUri(canvas); // First trim off info.json, then trim off ID.... uri = uri.substr(0, uri.lastIndexOf("/")); return uri.substr(0, uri.lastIndexOf("/")); } - getInfoUri(canvas: any): string{ + getInfoUri(canvas: Manifesto.ICanvas): string{ var infoUri = canvas.getInfoUri(); if (!infoUri){ @@ -147,37 +146,28 @@ class Provider extends BaseProvider implements ISeadragonProvider{ return script; } - getImages(clickThrough: (resource: Manifesto.IExternalResource) => void, - login: (loginService: string) => Promise, - getAccessToken: (tokenServiceUrl: string) => Promise, - storeAccessToken: (resource: Manifesto.IExternalResource, token: Manifesto.IAccessToken) => Promise, - getStoredAccessToken: (tokenService: string) => Promise, - handleResourceResponse: (resource: Manifesto.IExternalResource) => Promise): Promise { + getPagedIndices(canvasIndex?: number): number[]{ + if (typeof(canvasIndex) === 'undefined') canvasIndex = this.canvasIndex; - var indices = this.getPagedIndices(); - var images = []; + var indices = []; - _.each(indices, (index) => { - var r: Resource = new Resource(this); - r.dataUri = this.getInfoUri(this.getCanvasByIndex(index)); - images.push(r); - }); + if (!this.isPagingSettingEnabled()) { + indices.push(this.canvasIndex); + } else { + if (this.isFirstCanvas(canvasIndex) || (this.isLastCanvas(canvasIndex) && this.isTotalCanvasesEven())){ + indices = [canvasIndex]; + } else if (canvasIndex % 2){ + indices = [canvasIndex, canvasIndex + 1]; + } else { + indices = [canvasIndex - 1, canvasIndex]; + } - return new Promise((resolve) => { - this.manifest.loadResources( - images, - clickThrough, - login, - getAccessToken, - storeAccessToken, - getStoredAccessToken, - handleResourceResponse).then((resources: Manifesto.IExternalResource[]) => { - this.images = _.map(resources, (resource: Manifesto.IExternalResource) => { - return _.toPlainObject(resource.data); - }); - resolve(this.images); - }); - }); + if (this.getViewingDirection().toString() === manifesto.ViewingDirection.rightToLeft().toString()){ + indices = indices.reverse(); + } + } + + return indices; } isSearchWithinEnabled(): boolean { @@ -218,7 +208,7 @@ class Provider extends BaseProvider implements ISeadragonProvider{ return uri; } - searchWithin(terms: string, callback: (results: any) => void): void { + searchWithin(terms: string, cb: (results: any) => void): void { var that = this; var searchUri = this.getSearchWithinServiceUri(); @@ -230,7 +220,7 @@ class Provider extends BaseProvider implements ISeadragonProvider{ that.parseSearchWithinResults(results); } - callback(results); + cb(results); }); } diff --git a/src/lib/http-status-codes.js b/src/lib/http-status-codes.js new file mode 100644 index 000000000..47430ec26 --- /dev/null +++ b/src/lib/http-status-codes.js @@ -0,0 +1,59 @@ +var HTTPStatusCode; +(function (HTTPStatusCode) { + HTTPStatusCode.CONTINUE = 100; + HTTPStatusCode.SWITCHING_PROTOCOLS = 101; + HTTPStatusCode.PROCESSING = 102; + HTTPStatusCode.OK = 200; + HTTPStatusCode.CREATED = 201; + HTTPStatusCode.ACCEPTED = 202; + HTTPStatusCode.NON_AUTHORITATIVE_INFORMATION = 203; + HTTPStatusCode.NO_CONTENT = 204; + HTTPStatusCode.RESET_CONTENT = 205; + HTTPStatusCode.PARTIAL_CONTENT = 206; + HTTPStatusCode.MULTI_STATUS = 207; + HTTPStatusCode.MULTIPLE_CHOICES = 300; + HTTPStatusCode.MOVED_PERMANENTLY = 301; + HTTPStatusCode.MOVED_TEMPORARILY = 302; + HTTPStatusCode.SEE_OTHER = 303; + HTTPStatusCode.NOT_MODIFIED = 304; + HTTPStatusCode.USE_PROXY = 305; + HTTPStatusCode.TEMPORARY_REDIRECT = 307; + HTTPStatusCode.BAD_REQUEST = 400; + HTTPStatusCode.UNAUTHORIZED = 401; + HTTPStatusCode.PAYMENT_REQUIRED = 402; + HTTPStatusCode.FORBIDDEN = 403; + HTTPStatusCode.NOT_FOUND = 404; + HTTPStatusCode.METHOD_NOT_ALLOWED = 405; + HTTPStatusCode.NOT_ACCEPTABLE = 406; + HTTPStatusCode.PROXY_AUTHENTICATION_REQUIRED = 407; + HTTPStatusCode.REQUEST_TIME_OUT = 408; + HTTPStatusCode.CONFLICT = 409; + HTTPStatusCode.GONE = 410; + HTTPStatusCode.LENGTH_REQUIRED = 411; + HTTPStatusCode.PRECONDITION_FAILED = 412; + HTTPStatusCode.REQUEST_ENTITY_TOO_LARGE = 413; + HTTPStatusCode.REQUEST_URI_TOO_LARGE = 414; + HTTPStatusCode.UNSUPPORTED_MEDIA_TYPE = 415; + HTTPStatusCode.REQUESTED_RANGE_NOT_SATISFIABLE = 416; + HTTPStatusCode.EXPECTATION_FAILED = 417; + HTTPStatusCode.IM_A_TEAPOT = 418; + HTTPStatusCode.UNPROCESSABLE_ENTITY = 422; + HTTPStatusCode.LOCKED = 423; + HTTPStatusCode.FAILED_DEPENDENCY = 424; + HTTPStatusCode.UNORDERED_COLLECTION = 425; + HTTPStatusCode.UPGRADE_REQUIRED = 426; + HTTPStatusCode.PRECONDITION_REQUIRED = 428; + HTTPStatusCode.TOO_MANY_REQUESTS = 429; + HTTPStatusCode.REQUEST_HEADER_FIELDS_TOO_LARGE = 431; + HTTPStatusCode.INTERNAL_SERVER_ERROR = 500; + HTTPStatusCode.NOT_IMPLEMENTED = 501; + HTTPStatusCode.BAD_GATEWAY = 502; + HTTPStatusCode.SERVICE_UNAVAILABLE = 503; + HTTPStatusCode.GATEWAY_TIME_OUT = 504; + HTTPStatusCode.HTTP_VERSION_NOT_SUPPORTED = 505; + HTTPStatusCode.VARIANT_ALSO_NEGOTIATES = 506; + HTTPStatusCode.INSUFFICIENT_STORAGE = 507; + HTTPStatusCode.BANDWIDTH_LIMIT_EXCEEDED = 509; + HTTPStatusCode.NOT_EXTENDED = 510; + HTTPStatusCode.NETWORK_AUTHENTICATION_REQUIRED = 511; +})(HTTPStatusCode || (HTTPStatusCode = {})); diff --git a/src/lib/manifesto.js b/src/lib/manifesto.js index b24922224..b8f4e7413 100644 --- a/src/lib/manifesto.js +++ b/src/lib/manifesto.js @@ -271,6 +271,7 @@ var Manifesto; // //} // todo: use getImages instead. the client must decide which to use. + // each service has a getInfoUri method. Canvas.prototype.getInfoUri = function () { var infoUri; if (this.__jsonld.resources) { @@ -437,7 +438,7 @@ var Manifesto; Manifest.prototype.getRanges = function () { var ranges = []; var structures = this.getProperty('structures'); - if (!structures && !structures.length) + if (!structures) return ranges; for (var i = 0; i < structures.length; i++) { var r = structures[i]; @@ -556,11 +557,11 @@ var Manifesto; }; Manifest.prototype.getTree = function () { this.treeRoot = new Manifesto.TreeNode('root'); - this.treeRoot.label = "root"; + this.treeRoot.label = 'root'; if (!this.rootRange) return this.treeRoot; this.treeRoot.data = this.rootRange; - this.treeRoot.data.type = "manifest"; + this.treeRoot.data.type = 'manifest'; this.rootRange.treeNode = this.treeRoot; if (this.rootRange.ranges) { for (var i = 0; i < this.rootRange.ranges.length; i++) { @@ -575,7 +576,7 @@ var Manifesto; Manifest.prototype._parseTreeNode = function (node, range) { node.label = range.getLabel(); node.data = range; - node.data.type = "range"; + node.data.type = 'range'; range.treeNode = node; if (range.ranges) { for (var i = 0; i < range.ranges.length; i++) { @@ -598,7 +599,7 @@ var Manifesto; // always request the access token for every access controlled info.json request // returned access tokens are not stored, therefore the login window flashes for every request. resource.getData().then(function () { - if (resource.isAccessControlled) { + if (resource.isAccessControlled()) { // if the resource has a click through service, use that. if (resource.clickThroughService) { resolve(clickThrough(resource)); @@ -614,7 +615,7 @@ var Manifesto; } } else { - // this info.json isn't access controlled, therefore no need to request an access token + // this info.json isn't access controlled, therefore no need to request an access token. resolve(resource); } }); @@ -630,7 +631,7 @@ var Manifesto; // try using the stored access token resource.getData(storedAccessToken).then(function () { // if the info.json loaded using the stored access token - if (resource.status === 200) { + if (resource.status === HTTPStatusCode.OK) { resolve(handleResourceResponse(resource)); } else { @@ -651,10 +652,22 @@ var Manifesto; } }); }; + Manifest.prototype.loadResources = function (resources, clickThrough, login, getAccessToken, storeAccessToken, getStoredAccessToken, handleResourceResponse) { + var that = this; + return new Promise(function (resolve) { + var promises = _map(resources, function (resource) { + return that.loadResource(resource, clickThrough, login, getAccessToken, storeAccessToken, getStoredAccessToken, handleResourceResponse); + }); + Promise.all(promises) + .then(function () { + resolve(resources); + }); + }); + }; Manifest.prototype.authorize = function (resource, clickThrough, login, getAccessToken, storeAccessToken, getStoredAccessToken) { return new Promise(function (resolve, reject) { resource.getData().then(function () { - if (resource.isAccessControlled) { + if (resource.isAccessControlled()) { getStoredAccessToken(resource.tokenService.id).then(function (storedAccessToken) { if (storedAccessToken) { // try using the stored access token @@ -663,8 +676,15 @@ var Manifesto; }); } else { - // if the resource has a click through service, use that. - if (resource.clickThroughService) { + if (resource.status === HTTPStatusCode.MOVED_TEMPORARILY && !resource.isResponseHandled) { + // if the resource was redirected to a degraded version + // and the response hasn't been handled yet. + // if the client wishes to trigger a login, set resource.isResponseHandled to true + // and call loadResources() again. + resolve(resource); + } + else if (resource.clickThroughService) { + // if the resource has a click through service, use that. clickThrough(resource); } else { @@ -689,18 +709,6 @@ var Manifesto; }); }); }; - Manifest.prototype.loadResources = function (resources, clickThrough, login, getAccessToken, storeAccessToken, getStoredAccessToken, handleResourceResponse) { - var that = this; - return new Promise(function (resolve) { - var promises = _map(resources, function (resource) { - return that.loadResource(resource, clickThrough, login, getAccessToken, storeAccessToken, getStoredAccessToken, handleResourceResponse); - }); - Promise.all(promises) - .then(function () { - resolve(resources); - }); - }); - }; return Manifest; })(Manifesto.JSONLDResource); Manifesto.Manifest = Manifest; diff --git a/src/modules/uv-dialogues-module/EmbedDialogue.ts b/src/modules/uv-dialogues-module/EmbedDialogue.ts index b4383c187..35824b4c0 100644 --- a/src/modules/uv-dialogues-module/EmbedDialogue.ts +++ b/src/modules/uv-dialogues-module/EmbedDialogue.ts @@ -197,11 +197,11 @@ class EmbedDialogue extends Dialogue { selectCustom(): void { if (!this.$customWidth.val()) { - this.$customWidth.val(this.extension.embedWidth); + this.$customWidth.val(this.extension.embedWidth.toString()); } if (!this.$customHeight.val()){ - this.$customHeight.val(this.extension.embedHeight); + this.$customHeight.val(this.extension.embedHeight.toString()); } this.$sizes.find('.size').removeClass('selected'); diff --git a/src/modules/uv-mediaelementcenterpanel-module/MediaElementCenterPanel.ts b/src/modules/uv-mediaelementcenterpanel-module/MediaElementCenterPanel.ts index f4be05c27..7c2132fa3 100644 --- a/src/modules/uv-mediaelementcenterpanel-module/MediaElementCenterPanel.ts +++ b/src/modules/uv-mediaelementcenterpanel-module/MediaElementCenterPanel.ts @@ -3,7 +3,7 @@ import BaseProvider = require("../uv-shared-module/BaseProvider"); import Commands = require("../../extensions/uv-mediaelement-extension/Commands"); import CenterPanel = require("../uv-shared-module/CenterPanel"); import IMediaElementProvider = require("../../extensions/uv-mediaelement-extension/IMediaElementProvider"); -import Resource = require("../../modules/uv-shared-module/Resource"); +import ExternalResource = require("../../modules/uv-shared-module/ExternalResource"); class MediaElementCenterPanel extends CenterPanel { @@ -42,7 +42,7 @@ class MediaElementCenterPanel extends CenterPanel { } $.subscribe(BaseCommands.OPEN_MEDIA, (e, canvas) => { - that.viewMedia(canvas); + that.openMedia(); }); this.$container = $('
'); @@ -57,16 +57,15 @@ class MediaElementCenterPanel extends CenterPanel { return elementType.toString() === manifesto.ElementType.movingimage().toString(); } - viewMedia(canvas: Manifesto.ICanvas) { + openMedia() { var that = this; - // load info.json - // profile: http://wellcomelibrary.org/ld/ixif/0/alpha.json - this.extension.getMedia(canvas).then(() => { + this.extension.getExternalResources().then(() => { this.$container.empty(); + var canvas: Manifesto.ICanvas = this.provider.getCurrentCanvas(); this.mediaHeight = this.config.defaultHeight; this.mediaWidth = this.config.defaultWidth; @@ -87,11 +86,7 @@ class MediaElementCenterPanel extends CenterPanel { if (this.isVideo(canvas)){ - //if (!canvas.sources){ - // this.media = this.$container.append(''); - //} else { this.media = this.$container.append(''); - //} this.player = new MediaElementPlayer("#" + id, { type: ['video/mp4', 'video/webm', 'video/flv'], @@ -197,7 +192,7 @@ class MediaElementCenterPanel extends CenterPanel { this.$container.width(size.width); } - if (this.player && !this.extension.isFullScreen){ + if (this.player && !this.extension.isFullScreen()){ this.player.resize(); } diff --git a/src/modules/uv-pagingheaderpanel-module/PagingHeaderPanel.ts b/src/modules/uv-pagingheaderpanel-module/PagingHeaderPanel.ts index 66127c7f9..6d66660cb 100644 --- a/src/modules/uv-pagingheaderpanel-module/PagingHeaderPanel.ts +++ b/src/modules/uv-pagingheaderpanel-module/PagingHeaderPanel.ts @@ -189,7 +189,7 @@ class PagingHeaderPanel extends HeaderPanel { } isPageModeEnabled(): boolean { - return this.config.options.pageModeEnabled && this.extension.getMode().toString() === Mode.page.toString(); + return this.config.options.pageModeEnabled && (this.extension).getMode().toString() === Mode.page.toString(); } setTitles(): void { @@ -245,7 +245,7 @@ class PagingHeaderPanel extends HeaderPanel { if (!value) { - this.extension.showDialogue(this.content.emptyValue); + this.extension.showMessage(this.content.emptyValue); $.publish(BaseCommands.CANVAS_INDEX_CHANGE_FAILED); return; diff --git a/src/modules/uv-pdfcenterpanel-module/PDFCenterPanel.ts b/src/modules/uv-pdfcenterpanel-module/PDFCenterPanel.ts index ef3075240..895f84a90 100644 --- a/src/modules/uv-pdfcenterpanel-module/PDFCenterPanel.ts +++ b/src/modules/uv-pdfcenterpanel-module/PDFCenterPanel.ts @@ -15,50 +15,55 @@ class PDFCenterPanel extends CenterPanel { super.create(); - $.subscribe(BaseCommands.OPEN_MEDIA, (e, canvas) => { - this.viewMedia(canvas); + $.subscribe(BaseCommands.OPEN_MEDIA, (e) => { + this.openMedia(); }); } - viewMedia(canvas) { - var pdfUri = canvas.id; - var browser = window.browserDetect.browser; - var version = window.browserDetect.version; + openMedia() { - if ((browser === 'Explorer' && version < 10) || !this.config.options.usePdfJs) { + this.extension.getExternalResources().then(() => { + var canvas: Manifesto.ICanvas = this.provider.getCurrentCanvas(); - // create pdf object - new PDFObject({ - url: pdfUri, - id: "PDF" - }).embed('content'); + var pdfUri = canvas.id; + var browser = window.browserDetect.browser; + var version = window.browserDetect.version; - } else { - - var viewerPath; + if ((browser === 'Explorer' && version < 10) || !this.config.options.usePdfJs) { + + // create pdf object + new PDFObject({ + url: pdfUri, + id: "PDF" + }).embed('content'); - // todo: use compiler conditional - if (window.DEBUG){ - viewerPath = 'modules/uv-pdfcenterpanel-module/html/viewer.html'; } else { - viewerPath = 'html/uv-pdfcenterpanel-module/viewer.html'; - } - // load viewer.html - this.$content.load(viewerPath, () => { + var viewerPath; + + // todo: use compiler conditional if (window.DEBUG){ - PDFJS.workerSrc = 'extensions/uv-pdf-extension/lib/pdf.worker.min.js'; + viewerPath = 'modules/uv-pdfcenterpanel-module/html/viewer.html'; } else { - PDFJS.workerSrc = 'lib/pdf.worker.min.js'; + viewerPath = 'html/uv-pdfcenterpanel-module/viewer.html'; } - PDFJS.DEFAULT_URL = pdfUri; + // load viewer.html + this.$content.load(viewerPath, () => { + if (window.DEBUG){ + PDFJS.workerSrc = 'extensions/uv-pdf-extension/lib/pdf.worker.min.js'; + } else { + PDFJS.workerSrc = 'lib/pdf.worker.min.js'; + } - window.webViewerLoad(); + PDFJS.DEFAULT_URL = pdfUri; - this.resize(); - }); - } + window.webViewerLoad(); + + this.resize(); + }); + } + }); } resize() { diff --git a/src/modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel.ts b/src/modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel.ts index 620bc21a7..1cb2df4d8 100644 --- a/src/modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel.ts +++ b/src/modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel.ts @@ -2,8 +2,9 @@ import BaseCommands = require("../uv-shared-module/Commands"); import BaseProvider = require("../uv-shared-module/BaseProvider"); import Commands = require("../../extensions/uv-seadragon-extension/Commands"); import CenterPanel = require("../uv-shared-module/CenterPanel"); +import ISeadragonExtension = require("../../extensions/uv-seadragon-extension/ISeadragonExtension"); import ISeadragonProvider = require("../../extensions/uv-seadragon-extension/ISeadragonProvider"); -import Resource = require("../../modules/uv-shared-module/Resource"); +import ExternalResource = require("../../modules/uv-shared-module/ExternalResource"); import Params = require("../uv-shared-module/Params"); import SearchResult = require("../../extensions/uv-seadragon-extension/SearchResult"); import SearchResultRect = require("../../extensions/uv-seadragon-extension/SearchResultRect"); @@ -18,7 +19,7 @@ class SeadragonCenterPanel extends CenterPanel { isCreated: boolean = false; isFirstLoad: boolean = true; nextButtonEnabled: boolean = false; - pages: Resource[]; + pages: Manifesto.IExternalResource[]; prevButtonEnabled: boolean = false; title: string; userData: any; @@ -49,24 +50,19 @@ class SeadragonCenterPanel extends CenterPanel { this.$content.append(this.$viewer); $.subscribe(BaseCommands.OPEN_MEDIA, () => { - this.tryLoad(); + // todo: OPEN_MEDIA should be able to waitFor RESIZE + // https://facebook.github.io/flux/docs/dispatcher.html + if (!this.isCreated) { + setTimeout(() => { + this.createUI(); + this.openMedia(); + }, 500); // hack to allow time for panel open animations to complete. + } else { + this.openMedia(); + } }); } - // delay viewer creation to ensure it happens after initial resize - // todo: implement a listener for an onResized event - tryLoad(): void { - //console.log("try load"); - if (!this.isCreated) { - setTimeout(() => { - this.createUI(); - this.loadPages(); - }, 500); // allow time for panel open animations to complete. - } else { - this.loadPages(); - } - } - createUI(): void { //console.log("create ui"); this.$spinner = $('
'); @@ -289,12 +285,13 @@ class SeadragonCenterPanel extends CenterPanel { }); } - loadPages(): void { + openMedia(): void { this.$spinner.show(); - this.extension.getImages().then((images: any) => { - this.viewer.open(images); + this.extension.getExternalResources().then((resources: Manifesto.IExternalResource[]) => { + // OSD can open an array info.json objects + this.viewer.open(resources); }); } @@ -303,7 +300,7 @@ class SeadragonCenterPanel extends CenterPanel { var viewingDirection = this.provider.getViewingDirection().toString(); // if there's more than one image, align them next to each other. - if (this.provider.images.length > 1) { + if ((this.provider).resources.length > 1) { // check if tilesources should be aligned horizontally or vertically if (viewingDirection === manifesto.ViewingDirection.topToBottom().toString() || viewingDirection === manifesto.ViewingDirection.bottomToTop().toString()) { @@ -428,11 +425,11 @@ class SeadragonCenterPanel extends CenterPanel { switch (viewingDirection.toString()){ case manifesto.ViewingDirection.topToBottom().toString() : - this.viewer.viewport.fitBounds(new OpenSeadragon.Rect(0, 0, 1, this.viewer.world.getItemAt(0).normHeight * this.provider.images.length), true); + this.viewer.viewport.fitBounds(new OpenSeadragon.Rect(0, 0, 1, this.viewer.world.getItemAt(0).normHeight * (this.provider).resources.length), true); break; case manifesto.ViewingDirection.leftToRight().toString(): case manifesto.ViewingDirection.rightToLeft().toString() : - this.viewer.viewport.fitBounds(new OpenSeadragon.Rect(0, 0, this.provider.images.length, this.viewer.world.getItemAt(0).normHeight), true); + this.viewer.viewport.fitBounds(new OpenSeadragon.Rect(0, 0, (this.provider).resources.length, this.viewer.world.getItemAt(0).normHeight), true); break; } } @@ -512,7 +509,7 @@ class SeadragonCenterPanel extends CenterPanel { overlaySearchResults(): void { - var searchResults = this.provider.searchResults; + var searchResults = (this.provider).searchResults; if (!searchResults.length) return; diff --git a/src/modules/uv-searchfooterpanel-module/FooterPanel.ts b/src/modules/uv-searchfooterpanel-module/FooterPanel.ts index b6dd23620..e9c18c826 100644 --- a/src/modules/uv-searchfooterpanel-module/FooterPanel.ts +++ b/src/modules/uv-searchfooterpanel-module/FooterPanel.ts @@ -170,7 +170,7 @@ class FooterPanel extends BaseFooterPanel { }); // hide search options if not enabled/supported. - if (!this.provider.isSearchWithinEnabled()) { + if (!(this.provider).isSearchWithinEnabled()) { this.$searchContainer.hide(); this.$searchPagerContainer.hide(); this.$searchResultsContainer.hide(); @@ -178,7 +178,7 @@ class FooterPanel extends BaseFooterPanel { this.$element.addClass('min'); } - new AutoComplete(this.$searchText, this.provider.getAutoCompleteUri(), 300, + new AutoComplete(this.$searchText, (this.provider).getAutoCompleteUri(), 300, (results: string[]) => { return results; }, @@ -228,7 +228,7 @@ class FooterPanel extends BaseFooterPanel { positionSearchResultPlacemarkers(): void { - var results = this.provider.searchResults; + var results = (this.provider).searchResults; if (!results.length) return; @@ -410,7 +410,7 @@ class FooterPanel extends BaseFooterPanel { clearSearchResults(): void { - this.provider.searchResults = []; + (this.provider).searchResults = []; // clear all existing placemarkers var placemarkers = this.getSearchResultPlacemarkers(); @@ -468,7 +468,7 @@ class FooterPanel extends BaseFooterPanel { } isPageModeEnabled(): boolean { - return this.config.options.pageModeEnabled && this.extension.getMode().toString() === Mode.page.toString(); + return this.config.options.pageModeEnabled && (this.extension).getMode().toString() === Mode.page.toString(); } displaySearchResults(terms, results): void { @@ -507,7 +507,7 @@ class FooterPanel extends BaseFooterPanel { resize(): void { super.resize(); - if (this.provider.searchResults.length) { + if ((this.provider).searchResults.length) { this.positionSearchResultPlacemarkers(); } diff --git a/src/modules/uv-shared-module/BaseExtension.ts b/src/modules/uv-shared-module/BaseExtension.ts index b6c1b7b8e..dd89feedf 100644 --- a/src/modules/uv-shared-module/BaseExtension.ts +++ b/src/modules/uv-shared-module/BaseExtension.ts @@ -2,6 +2,7 @@ import BaseCommands = require("./Commands"); import BaseProvider = require("./BaseProvider"); import BootStrapper = require("../../Bootstrapper"); import ClickThroughDialogue = require("../../modules/uv-dialogues-module/ClickThroughDialogue"); +import ExternalResource = require("./ExternalResource"); import IExtension = require("./IExtension"); import IProvider = require("./IProvider"); import Params = require("./Params"); @@ -48,6 +49,7 @@ class BaseExtension implements IExtension { this.bootstrapper.socket = new easyXDM.Socket({ onMessage: (message, origin) => { message = $.parseJSON(message); + // todo: waitFor CREATED this.handleParentFrameEvent(message); } }); @@ -140,7 +142,7 @@ class BaseExtension implements IExtension { }); $.subscribe(BaseCommands.ESCAPE, () => { - if (this.bootstrapper.isFullScreen) { + if (this.isFullScreen()) { $.publish(BaseCommands.TOGGLE_FULLSCREEN); } }); @@ -214,7 +216,7 @@ class BaseExtension implements IExtension { $.publish(BaseCommands.CREATED); this.setParams(); this.setDefaultFocus(); - this.viewMedia(); + this.viewCanvas(0); } setParams(): void{ @@ -230,17 +232,6 @@ class BaseExtension implements IExtension { }, 1); } - viewMedia(): void { - var canvas = this.provider.getCanvasByIndex(0); - - this.viewCanvas(0, () => { - - $.publish(BaseCommands.OPEN_MEDIA, [canvas]); - - this.setParam(Params.canvasIndex, 0); - }); - } - width(): number { return $(window).width(); } @@ -268,7 +259,7 @@ class BaseExtension implements IExtension { } handleParentFrameEvent(message): void { - // todo: come up with better way of postponing this until viewer is fully created + // todo: waitFor CREATED setTimeout(() => { switch (message.eventName) { case BaseCommands.TOGGLE_FULLSCREEN: @@ -278,6 +269,59 @@ class BaseExtension implements IExtension { }, 1000); } + getExternalResources(): Promise { + + var indices = this.provider.getPagedIndices(); + var resources = []; + + _.each(indices, (index) => { + var r: Manifesto.IExternalResource = new ExternalResource(this.provider); + r.dataUri = this.provider.getInfoUri(this.provider.getCanvasByIndex(index)); + resources.push(r); + }); + + return new Promise((resolve) => { + this.provider.manifest.loadResources( + resources, + this.clickThrough, + this.login, + this.getAccessToken, + this.storeAccessToken, + this.getStoredAccessToken, + this.handleExternalResourceResponse).then((r: Manifesto.IExternalResource[]) => { + this.provider.resources = _.map(r, (resource: Manifesto.IExternalResource) => { + return _.toPlainObject(resource.data); + }); + resolve(this.provider.resources); + })['catch']((errorMessage) => { + this.showMessage(errorMessage); + }); + }); + } + + //getExternalResources(): Promise { + // var canvas: Manifesto.ICanvas = this.provider.getCurrentCanvas(); + // var resource: Manifesto.IExternalResource = new ExternalResource(this.provider); + // var ixifService = canvas.getService(manifesto.ServiceProfile.ixif()); + // + // resource.dataUri = ixifService.getInfoUri(); + // + // return new Promise((resolve) => { + // (this.provider).manifest.loadResources( + // [resource], + // this.clickThrough, + // this.login, + // this.getAccessToken, + // this.storeAccessToken, + // this.getStoredAccessToken, + // this.handleExternalResourceResponse).then((resources: Manifesto.IExternalResource[]) => { + // resolve(resources); + // })['catch']((errorMessage) => { + // this.showMessage(errorMessage); + // }); + // }); + //} + // get hash or data-attribute params depending on whether the UV is embedded. getParam(key: Params): any{ var value; @@ -302,15 +346,13 @@ class BaseExtension implements IExtension { } } - viewCanvas(canvasIndex: number, callback?: (i: number) => any): void { - + viewCanvas(canvasIndex: number): void { + if (canvasIndex === -1) return; this.provider.canvasIndex = canvasIndex; - $.publish(BaseCommands.CANVAS_INDEX_CHANGED, [canvasIndex]); - this.triggerSocket(BaseCommands.CANVAS_INDEX_CHANGED, canvasIndex); - - if (callback) callback(canvasIndex); + $.publish(BaseCommands.OPEN_MEDIA); + this.setParam(Params.canvasIndex, canvasIndex); } showMessage(message: string, acceptCallback?: any, buttonText?: string, allowClose?: boolean): void { @@ -334,12 +376,12 @@ class BaseExtension implements IExtension { return Shell.$overlays.is(':visible'); } - viewManifest(manifest: any): void{ + viewManifest(manifestIndex: number): void{ //var seeAlsoUri = this.provider.getManifestSeeAlsoUri(manifest); //if (seeAlsoUri){ // window.open(seeAlsoUri, '_blank'); //} else { - if (this.bootstrapper.isFullScreen) { + if (this.isFullScreen()) { $.publish(BaseCommands.TOGGLE_FULLSCREEN); } @@ -356,6 +398,10 @@ class BaseExtension implements IExtension { } } + isFullScreen(): boolean { + return this.bootstrapper.isFullScreen; + } + isLeftPanelEnabled(): boolean{ return Utils.Bools.GetBool(this.provider.config.options.leftPanelEnabled, true) && this.provider.isMultiCanvas(); @@ -431,10 +477,15 @@ class BaseExtension implements IExtension { }); } - handleResourceResponse(resource: Manifesto.IExternalResource) : Promise { + handleExternalResourceResponse(resource: Manifesto.IExternalResource) : Promise { return new Promise((resolve, reject) => { - if (resource.status === 200) { + resource.isResponseHandled = true; + + if (resource.status === HTTPStatusCode.OK) { + resolve(resource); + } else if (resource.status === HTTPStatusCode.MOVED_TEMPORARILY) { resolve(resource); + $.publish(BaseCommands.OPEN_MEDIA); } else { // access denied reject(resource.error.statusText); diff --git a/src/modules/uv-shared-module/BaseProvider.ts b/src/modules/uv-shared-module/BaseProvider.ts index c1e548c55..12ae36cd0 100644 --- a/src/modules/uv-shared-module/BaseProvider.ts +++ b/src/modules/uv-shared-module/BaseProvider.ts @@ -3,7 +3,7 @@ import BootStrapper = require("../../Bootstrapper"); import CanvasType = require("./CanvasType"); import IProvider = require("./IProvider"); import Params = require("./Params"); -import Resource = require("./Resource"); +import ExternalResource = require("./ExternalResource"); import Storage = require("./Storage"); // providers contain methods that could be implemented differently according @@ -24,6 +24,7 @@ class BaseProvider implements IProvider{ isOnlyInstance: boolean; isReload: boolean; manifest: Manifesto.IManifest; + resources: Manifesto.IExternalResource[]; rootStructure: any; sequence: Manifesto.ISequence; sequenceIndex: number; @@ -221,28 +222,14 @@ class BaseProvider implements IProvider{ return false; } + getInfoUri(canvas: Manifesto.ICanvas): string{ + return canvas.getInfoUri(); + } + getPagedIndices(canvasIndex?: number): number[]{ if (typeof(canvasIndex) === 'undefined') canvasIndex = this.canvasIndex; - var indices = []; - - if (!this.isPagingSettingEnabled()) { - indices.push(this.canvasIndex); - } else { - if (this.isFirstCanvas(canvasIndex) || (this.isLastCanvas(canvasIndex) && this.isTotalCanvasesEven())){ - indices = [canvasIndex]; - } else if (canvasIndex % 2){ - indices = [canvasIndex, canvasIndex + 1]; - } else { - indices = [canvasIndex - 1, canvasIndex]; - } - - if (this.getViewingDirection().toString() === manifesto.ViewingDirection.rightToLeft().toString()){ - indices = indices.reverse(); - } - } - - return indices; + return [canvasIndex]; } getViewingDirection(): Manifesto.ViewingDirection { diff --git a/src/modules/uv-shared-module/BaseView.ts b/src/modules/uv-shared-module/BaseView.ts index 031741846..fe249e36e 100644 --- a/src/modules/uv-shared-module/BaseView.ts +++ b/src/modules/uv-shared-module/BaseView.ts @@ -1,15 +1,17 @@ import Panel = require("./Panel"); import BootStrapper = require("../../Bootstrapper"); +import IExtension = require("./IExtension"); +import IProvider = require("./IProvider"); class BaseView extends Panel{ bootstrapper: BootStrapper; config: any; content: any; - extension: any; + extension: IExtension; modules: string[]; options: any; - provider: any; + provider: IProvider; constructor($element: JQuery, fitToParentWidth?: boolean, fitToParentHeight?: boolean) { this.modules = []; diff --git a/src/modules/uv-shared-module/Resource.ts b/src/modules/uv-shared-module/ExternalResource.ts similarity index 70% rename from src/modules/uv-shared-module/Resource.ts rename to src/modules/uv-shared-module/ExternalResource.ts index e5d80f5e8..da91991bf 100644 --- a/src/modules/uv-shared-module/Resource.ts +++ b/src/modules/uv-shared-module/ExternalResource.ts @@ -1,12 +1,12 @@ import IProvider = require("./IProvider"); import Storage = require("./Storage"); -class Resource implements Manifesto.IExternalResource { +class ExternalResource implements Manifesto.IExternalResource { public clickThroughService: Manifesto.IService; public data: any; public dataUri: string; public error: any; - public isAccessControlled: boolean = false; + public isResponseHandled: boolean = false; public loginService: Manifesto.IService; public logoutService: Manifesto.IService; public provider: IProvider; @@ -18,19 +18,23 @@ class Resource implements Manifesto.IExternalResource { } private _parseAuthServices(resource: any): void { - this.clickThroughService = this.provider.getService(resource, manifesto.ServiceProfile.clickThrough().toString()); this.loginService = this.provider.getService(resource, manifesto.ServiceProfile.login().toString()); this.logoutService = this.provider.getService(resource, manifesto.ServiceProfile.logout().toString()); this.tokenService = this.provider.getService(resource, manifesto.ServiceProfile.token().toString()); + } - if (this.clickThroughService || this.loginService) this.isAccessControlled = true; + public isAccessControlled(): boolean { + if(this.clickThroughService || this.loginService){ + return true; + } + return false; } - public getData(accessToken?: Manifesto.IAccessToken): Promise { + public getData(accessToken?: Manifesto.IAccessToken): Promise { var that = this; - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { $.ajax({ url: that.dataUri, @@ -42,20 +46,35 @@ class Resource implements Manifesto.IExternalResource { } } }).done((data) => { - that.status = 200; + + var uri = data['@id']; + + if (!_.endsWith(uri, '/info.json')){ + uri += '/info.json'; + } + + if (uri !== that.dataUri){ + that.status = HTTPStatusCode.MOVED_TEMPORARILY; + } else { + that.status = HTTPStatusCode.OK; + } + that.data = data; that._parseAuthServices(that.data); resolve(that); + }).fail((error) => { + that.status = error.status; that.error = error; if (error.responseJSON){ that._parseAuthServices(error.responseJSON); } resolve(that); + }); }); } } -export = Resource; \ No newline at end of file +export = ExternalResource; \ No newline at end of file diff --git a/src/modules/uv-shared-module/FooterPanel.ts b/src/modules/uv-shared-module/FooterPanel.ts index 9ff53d74a..41b50c617 100644 --- a/src/modules/uv-shared-module/FooterPanel.ts +++ b/src/modules/uv-shared-module/FooterPanel.ts @@ -75,7 +75,7 @@ class FooterPanel extends BaseView { this.$fullScreenBtn.addClass('lightbox'); } - if (this.bootstrapper.isFullScreen) { + if (this.extension.isFullScreen()) { this.$fullScreenBtn.swapClass('fullScreen', 'exitFullscreen'); this.$fullScreenBtn.text(this.content.exitFullScreen); this.$fullScreenBtn.attr('title', this.content.exitFullScreen); diff --git a/src/modules/uv-shared-module/HeaderPanel.ts b/src/modules/uv-shared-module/HeaderPanel.ts index 886cda1cc..7505a83d8 100644 --- a/src/modules/uv-shared-module/HeaderPanel.ts +++ b/src/modules/uv-shared-module/HeaderPanel.ts @@ -186,7 +186,7 @@ class HeaderPanel extends BaseView { } // hide toggle buttons below minimum width - if (this.extension.width() < this.provider.options.minWidthBreakPoint){ + if (this.extension.width() < this.provider.config.options.minWidthBreakPoint){ if (this.pagingToggleIsVisible()) this.$pagingToggleButton.hide(); if (this.localeToggleIsVisible()) this.$localeToggleButton.hide(); } else { diff --git a/src/modules/uv-shared-module/IExtension.ts b/src/modules/uv-shared-module/IExtension.ts index 6ac686a10..1b870e7ca 100644 --- a/src/modules/uv-shared-module/IExtension.ts +++ b/src/modules/uv-shared-module/IExtension.ts @@ -2,30 +2,31 @@ import BaseProvider = require("./BaseProvider"); import Params = require("./Params"); interface IExtension{ - - embedHeight: number; - embedWidth: number; - mouseX: number; - mouseY: number; - name: string; - provider: any; - shifted: boolean; - create(): void; createModules(): void; dependenciesLoaded(): void; + embedHeight: number; + embedWidth: number; getDependencies(callback: (deps: any) => void): any; + getExternalResources(): Promise; getParam(key: Params): any; height(): number; + isFullScreen(): boolean; isOverlayActive(): boolean; loadDependencies(deps: any): void; + mouseX: number; + mouseY: number; + name: string; + provider: any; redirect(uri: string): void; refresh(): void; resize(): void; + shifted: boolean; showMessage(message: string, acceptCallback?: any, buttonText?: string, allowClose?: boolean): void; + tabbing: boolean; triggerSocket(eventName: string, eventObject: any): void; - viewManifest(manifest: any): void; - viewMedia(): void; + viewCanvas(canvasIndex): void; + viewManifest(manifestIndex: number): void width(): number; } diff --git a/src/modules/uv-shared-module/IProvider.ts b/src/modules/uv-shared-module/IProvider.ts index 1aa20311c..7975a2eee 100644 --- a/src/modules/uv-shared-module/IProvider.ts +++ b/src/modules/uv-shared-module/IProvider.ts @@ -1,56 +1,59 @@ import BootstrapParams = require("../../BootstrapParams"); import BootStrapper = require("../../Bootstrapper"); import CanvasType = require("./CanvasType"); -import Resource = require("./Resource"); +import ExternalResource = require("./ExternalResource"); // the provider contains all methods related to // interacting with the IIIF data model. interface IProvider{ canvasIndex: number; manifest: Manifesto.IManifest; + resources: Manifesto.IExternalResource[]; sequence: any; sequenceIndex: number; addTimestamp(uri: string): string; getAttribution(): string; - getLicense(): string; - getLogo(): string; getCanvasByIndex(index: number): any; - getCanvasIndexByLabel(label: string): number; getCanvasIndexById(id: string): number; + getCanvasIndexByLabel(label: string): number; getCanvasType(canvas?: Manifesto.ICanvas): Manifesto.CanvasType; getCurrentCanvas(): any; + getFirstPageIndex(): number; + getInfoUri(canvas: Manifesto.ICanvas): string; + getLastCanvasLabel(): string; + getLastPageIndex(): number; + getLicense(): string; + getLogo(): string; getManifestType(): string; getMetadata(includeRootProperties?: boolean): any; + getNextPageIndex(index?: number): number; + getPagedIndices(index?: number): number[]; + getPrevPageIndex(index?: number): number; + getRangeByPath(path: string): Manifesto.IRange; getRendering(resource: any, format: Manifesto.RenderingFormat): Manifesto.IRendering; getRenderings(resource: any): Manifesto.IRendering[]; getSeeAlso(): any; getSequenceType(): string; getService(resource: any, profile: Manifesto.ServiceProfile | string): Manifesto.IService; - getRangeByPath(path: string): Manifesto.IRange; + getStartCanvasIndex(): number; getThumbs(width: number, height: number): Manifesto.Thumb[]; getTitle(): string; getTotalCanvases(): number; getTree(): Manifesto.TreeNode; - getPagedIndices(index?: number): number[]; - getFirstPageIndex(): number; - getLastPageIndex(): number; - getPrevPageIndex(index?: number): number; - getNextPageIndex(index?: number): number; - getStartCanvasIndex(): number; getViewingDirection(): Manifesto.ViewingDirection; isCanvasIndexOutOfRange(index: number): boolean; isFirstCanvas(index?: number): boolean; isLastCanvas(index?: number): boolean; - isPagingEnabled(): boolean; - isPagingSettingEnabled(): boolean; isMultiCanvas(): boolean; isMultiSequence(): boolean; + isPagingEnabled(): boolean; + isPagingSettingEnabled(): boolean; isSeeAlsoEnabled(): boolean; isTotalCanvasesEven(): boolean; load(): void; - // todo: move these to extension + // todo: move these to baseextension? bootstrapper: BootStrapper; config: any; domain: string; diff --git a/src/modules/uv-treeviewleftpanel-module/GalleryView.ts b/src/modules/uv-treeviewleftpanel-module/GalleryView.ts index aa9e53fa2..00625ba6e 100644 --- a/src/modules/uv-treeviewleftpanel-module/GalleryView.ts +++ b/src/modules/uv-treeviewleftpanel-module/GalleryView.ts @@ -2,6 +2,7 @@ import BaseCommands = require("../uv-shared-module/Commands"); import BaseView = require("../uv-shared-module/BaseView"); import Commands = require("../../extensions/uv-seadragon-extension/Commands"); import IProvider = require("../uv-shared-module/IProvider"); +import ISeadragonExtension = require("../../extensions/uv-seadragon-extension/ISeadragonExtension"); import ISeadragonProvider = require("../../extensions/uv-seadragon-extension/ISeadragonProvider"); import Mode = require("../../extensions/uv-seadragon-extension/Mode"); @@ -261,8 +262,8 @@ class GalleryView extends BaseView { } isPageModeEnabled(): boolean { - if (typeof this.extension.getMode === "function") { - return this.config.options.pageModeEnabled && this.extension.getMode().toString() === Mode.page.toString(); + if (typeof (this.extension).getMode === "function") { // todo: why is this needed? + return this.config.options.pageModeEnabled && (this.extension).getMode().toString() === Mode.page.toString(); } return this.config.options.pageModeEnabled; } diff --git a/src/modules/uv-treeviewleftpanel-module/ThumbsView.ts b/src/modules/uv-treeviewleftpanel-module/ThumbsView.ts index 17eafd24f..0fbe1b38f 100644 --- a/src/modules/uv-treeviewleftpanel-module/ThumbsView.ts +++ b/src/modules/uv-treeviewleftpanel-module/ThumbsView.ts @@ -2,6 +2,7 @@ import BaseCommands = require("../uv-shared-module/Commands"); import BaseView = require("../uv-shared-module/BaseView"); import Commands = require("../../extensions/uv-seadragon-extension/Commands"); import IProvider = require("../uv-shared-module/IProvider"); +import ISeadragonExtension = require("../../extensions/uv-seadragon-extension/ISeadragonExtension"); import ISeadragonProvider = require("../../extensions/uv-seadragon-extension/ISeadragonProvider"); import Mode = require("../../extensions/uv-seadragon-extension/Mode"); import Shell = require("../uv-shared-module/Shell"); @@ -235,8 +236,8 @@ class ThumbsView extends BaseView { } isPageModeEnabled(): boolean { - if (typeof this.extension.getMode === "function") { - return this.config.options.pageModeEnabled && this.extension.getMode().toString() === Mode.page.toString(); + if (typeof (this.extension).getMode === "function") { + return this.config.options.pageModeEnabled && (this.extension).getMode().toString() === Mode.page.toString(); } return this.config.options.pageModeEnabled; } diff --git a/src/modules/uv-treeviewleftpanel-module/TreeView.ts b/src/modules/uv-treeviewleftpanel-module/TreeView.ts index 2691fa4e0..d6fb24b04 100644 --- a/src/modules/uv-treeviewleftpanel-module/TreeView.ts +++ b/src/modules/uv-treeviewleftpanel-module/TreeView.ts @@ -1,6 +1,7 @@ import BaseCommands = require("../uv-shared-module/Commands"); import BaseView = require("../uv-shared-module/BaseView"); import Commands = require("../../extensions/uv-seadragon-extension/Commands"); +import ISeadragonProvider = require("../../extensions/uv-seadragon-extension/ISeadragonProvider"); import Shell = require("../uv-shared-module/Shell"); class TreeView extends BaseView { @@ -119,11 +120,12 @@ class TreeView extends BaseView { selectTreeNodeFromCanvasIndex(index: number): void { // may be authenticating - if (index == -1) return; + if (index === -1) return; this.deselectCurrentNode(); - var range = this.provider.getRangeByCanvasIndex(index); + var canvas: Manifesto.ICanvas = this.provider.getCanvasByIndex(index); + var range: Manifesto.IRange = canvas.getRange(); if (!range) return; diff --git a/src/typings/http-status-codes.d.ts b/src/typings/http-status-codes.d.ts new file mode 100644 index 000000000..e3662fc9a --- /dev/null +++ b/src/typings/http-status-codes.d.ts @@ -0,0 +1,58 @@ +declare module HTTPStatusCode { + var CONTINUE: number; + var SWITCHING_PROTOCOLS: number; + var PROCESSING: number; + var OK: number; + var CREATED: number; + var ACCEPTED: number; + var NON_AUTHORITATIVE_INFORMATION: number; + var NO_CONTENT: number; + var RESET_CONTENT: number; + var PARTIAL_CONTENT: number; + var MULTI_STATUS: number; + var MULTIPLE_CHOICES: number; + var MOVED_PERMANENTLY: number; + var MOVED_TEMPORARILY: number; + var SEE_OTHER: number; + var NOT_MODIFIED: number; + var USE_PROXY: number; + var TEMPORARY_REDIRECT: number; + var BAD_REQUEST: number; + var UNAUTHORIZED: number; + var PAYMENT_REQUIRED: number; + var FORBIDDEN: number; + var NOT_FOUND: number; + var METHOD_NOT_ALLOWED: number; + var NOT_ACCEPTABLE: number; + var PROXY_AUTHENTICATION_REQUIRED: number; + var REQUEST_TIME_OUT: number; + var CONFLICT: number; + var GONE: number; + var LENGTH_REQUIRED: number; + var PRECONDITION_FAILED: number; + var REQUEST_ENTITY_TOO_LARGE: number; + var REQUEST_URI_TOO_LARGE: number; + var UNSUPPORTED_MEDIA_TYPE: number; + var REQUESTED_RANGE_NOT_SATISFIABLE: number; + var EXPECTATION_FAILED: number; + var IM_A_TEAPOT: number; + var UNPROCESSABLE_ENTITY: number; + var LOCKED: number; + var FAILED_DEPENDENCY: number; + var UNORDERED_COLLECTION: number; + var UPGRADE_REQUIRED: number; + var PRECONDITION_REQUIRED: number; + var TOO_MANY_REQUESTS: number; + var REQUEST_HEADER_FIELDS_TOO_LARGE: number; + var INTERNAL_SERVER_ERROR: number; + var NOT_IMPLEMENTED: number; + var BAD_GATEWAY: number; + var SERVICE_UNAVAILABLE: number; + var GATEWAY_TIME_OUT: number; + var HTTP_VERSION_NOT_SUPPORTED: number; + var VARIANT_ALSO_NEGOTIATES: number; + var INSUFFICIENT_STORAGE: number; + var BANDWIDTH_LIMIT_EXCEEDED: number; + var NOT_EXTENDED: number; + var NETWORK_AUTHENTICATION_REQUIRED: number; +} diff --git a/src/typings/manifesto.d.ts b/src/typings/manifesto.d.ts index a73b878c6..b3cc37907 100644 --- a/src/typings/manifesto.d.ts +++ b/src/typings/manifesto.d.ts @@ -162,8 +162,8 @@ declare module Manifesto { private _parseTreeNode(node, range); isMultiSequence(): boolean; loadResource(resource: IExternalResource, clickThrough: (resource: IExternalResource) => void, login: (loginServiceUrl: string) => Promise, getAccessToken: (tokenServiceUrl: string) => Promise, storeAccessToken: (resource: IExternalResource, token: IAccessToken) => Promise, getStoredAccessToken: (tokenServiceUrl: string) => Promise, handleResourceResponse: (resource: IExternalResource) => Promise): Promise; - authorize(resource: IExternalResource, clickThrough: (resource: IExternalResource) => void, login: (loginServiceUrl: string) => Promise, getAccessToken: (tokenServiceUrl: string) => Promise, storeAccessToken: (resource: IExternalResource, token: IAccessToken) => Promise, getStoredAccessToken: (tokenServiceUrl: string) => Promise): Promise; loadResources(resources: IExternalResource[], clickThrough: (resource: IExternalResource) => void, login: (loginServiceUrl: string) => Promise, getAccessToken: (tokenServiceUrl: string) => Promise, storeAccessToken: (resource: IExternalResource, token: IAccessToken) => Promise, getStoredAccessToken: (tokenServiceUrl: string) => Promise, handleResourceResponse: (resource: IExternalResource) => Promise): Promise; + authorize(resource: IExternalResource, clickThrough: (resource: IExternalResource) => void, login: (loginServiceUrl: string) => Promise, getAccessToken: (tokenServiceUrl: string) => Promise, storeAccessToken: (resource: IExternalResource, token: IAccessToken) => Promise, getStoredAccessToken: (tokenServiceUrl: string) => Promise): Promise; } } declare module Manifesto { @@ -295,12 +295,13 @@ declare module Manifesto { data: any; dataUri: string; error: any; - isAccessControlled: boolean; + isResponseHandled: boolean; loginService: IService; logoutService: IService; status: number; tokenService: IService; getData(accessToken?: IAccessToken): Promise; + isAccessControlled(): boolean; } } declare module Manifesto {