diff --git a/Samples/DataSources/datasources.html b/Samples/DataSources/datasources.html index 21e1e5eb..44455e0f 100644 --- a/Samples/DataSources/datasources.html +++ b/Samples/DataSources/datasources.html @@ -15,7 +15,7 @@ - + diff --git a/Samples/Filtering/filtering.html b/Samples/Filtering/filtering.html index ec1df303..f51628bf 100644 --- a/Samples/Filtering/filtering.html +++ b/Samples/Filtering/filtering.html @@ -15,7 +15,7 @@ - + diff --git a/Samples/Parameters/parameters.html b/Samples/Parameters/parameters.html index 48874220..781db8f9 100644 --- a/Samples/Parameters/parameters.html +++ b/Samples/Parameters/parameters.html @@ -15,7 +15,7 @@ - + diff --git a/Samples/Settings/settings.html b/Samples/Settings/settings.html index 8f04aefc..f14f0a7a 100644 --- a/Samples/Settings/settings.html +++ b/Samples/Settings/settings.html @@ -14,7 +14,7 @@ - + diff --git a/Tutorial/Part_1/MarksSelection.html b/Tutorial/Part_1/MarksSelection.html index 5f6eed82..cfd05416 100644 --- a/Tutorial/Part_1/MarksSelection.html +++ b/Tutorial/Part_1/MarksSelection.html @@ -12,7 +12,7 @@ - + diff --git a/Tutorial/Part_1/readme.md b/Tutorial/Part_1/readme.md index 5b6f6ec0..26879d5a 100644 --- a/Tutorial/Part_1/readme.md +++ b/Tutorial/Part_1/readme.md @@ -22,4 +22,4 @@ Drag out the extension for Part 1 and you should see the name of your dashboard ![Part 1 Screenshot](../assets/Part_1.png) -[Next Section (Part 2 - Ask the User to Select a Sheet)](../Part_2/readme.md) +[Next Section (Part 2 - Ask the User to Select a Sheet)](../Part_2/readme.md) \ No newline at end of file diff --git a/Tutorial/Part_2/MarksSelection.html b/Tutorial/Part_2/MarksSelection.html index d40cabb6..16dbcd6e 100644 --- a/Tutorial/Part_2/MarksSelection.html +++ b/Tutorial/Part_2/MarksSelection.html @@ -12,7 +12,7 @@ - + diff --git a/Tutorial/Part_2/MarksSelection.js b/Tutorial/Part_2/MarksSelection.js index 297339ba..94a7cef7 100644 --- a/Tutorial/Part_2/MarksSelection.js +++ b/Tutorial/Part_2/MarksSelection.js @@ -25,7 +25,7 @@ // The first step in choosing a sheet will be asking Tableau what sheets are available const worksheets = tableau.extensions.dashboardContent.dashboard.worksheets; - // Next, we loop through all of these worksheets and add buttons for each one + // Next, we loop through all of these worksheets add add buttons for each one worksheets.forEach(function (worksheet) { // Declare our new button which contains the sheet name const button = $(""); diff --git a/Tutorial/Part_3/MarksSelection.html b/Tutorial/Part_3/MarksSelection.html index c738077b..7e2f6e31 100644 --- a/Tutorial/Part_3/MarksSelection.html +++ b/Tutorial/Part_3/MarksSelection.html @@ -12,7 +12,7 @@ - + diff --git a/Tutorial/Part_4/MarksSelection.html b/Tutorial/Part_4/MarksSelection.html index 1518cb6d..ad8d4c74 100644 --- a/Tutorial/Part_4/MarksSelection.html +++ b/Tutorial/Part_4/MarksSelection.html @@ -12,7 +12,7 @@ - + diff --git a/Tutorial/Part_5/MarksSelection.html b/Tutorial/Part_5/MarksSelection.html index f3fbc1ed..43ed1998 100644 --- a/Tutorial/Part_5/MarksSelection.html +++ b/Tutorial/Part_5/MarksSelection.html @@ -12,7 +12,7 @@ - + diff --git a/Tutorial/Part_6/MarksSelection.html b/Tutorial/Part_6/MarksSelection.html index ad277f37..d27096b5 100644 --- a/Tutorial/Part_6/MarksSelection.html +++ b/Tutorial/Part_6/MarksSelection.html @@ -12,7 +12,7 @@ - + diff --git a/Tutorial/ReactVersion/src/index.html b/Tutorial/ReactVersion/src/index.html index bb540872..c537e1d0 100644 --- a/Tutorial/ReactVersion/src/index.html +++ b/Tutorial/ReactVersion/src/index.html @@ -9,7 +9,7 @@ - + diff --git a/assets/frelard_objects_extension.png b/assets/frelard_objects_extension.png new file mode 100644 index 00000000..bcc056ad Binary files /dev/null and b/assets/frelard_objects_extension.png differ diff --git a/docs/enums/encodingtype.html b/docs/enums/encodingtype.html index c366c4f6..8ebbe79b 100644 --- a/docs/enums/encodingtype.html +++ b/docs/enums/encodingtype.html @@ -992,7 +992,7 @@

Angle

Angle: = "angle"
@@ -1002,7 +1002,7 @@

Color

Color: = "color"
@@ -1012,7 +1012,7 @@

Column

Column: = "column"
@@ -1022,7 +1022,7 @@

Detail

Detail: = "detail"
@@ -1032,7 +1032,7 @@

Filter

Filter: = "filter"
@@ -1042,7 +1042,7 @@

Label

Label: = "label"
@@ -1052,7 +1052,7 @@

MarksType

MarksType: = "marks-type"
@@ -1062,7 +1062,7 @@

MeasureValues

MeasureValues: = "measure-values"
@@ -1072,7 +1072,7 @@

Page

Page: = "page"
@@ -1082,7 +1082,7 @@

Path

Path: = "path"
@@ -1092,7 +1092,7 @@

Row

Row: = "row"
@@ -1102,7 +1102,7 @@

Shape

Shape: = "shape"
@@ -1112,7 +1112,7 @@

Size

Size: = "size"
@@ -1122,7 +1122,7 @@

Tooltip

Tooltip: = "tooltip"
diff --git a/docs/enums/errorcodes.html b/docs/enums/errorcodes.html index 69c928e3..0a25721c 100644 --- a/docs/enums/errorcodes.html +++ b/docs/enums/errorcodes.html @@ -1007,7 +1007,7 @@

DialogAlreadyOpen

DialogAlreadyOpen: = "dialog-already-open"
@@ -1022,7 +1022,7 @@

DialogClosedByUser

DialogClosedByUser: = "dialog-closed-by-user"
@@ -1037,7 +1037,7 @@

FilterCannotBePerformed

FilterCannotBePerformed: = "filter-cannot-be-performed"
@@ -1052,7 +1052,7 @@

InternalError

InternalError: = "internal-error"
@@ -1067,7 +1067,7 @@

InvalidAggregationFieldName

InvalidAggregationFieldName: = "invalid-aggregation-field-name"
@@ -1082,7 +1082,7 @@

InvalidDateParameter

InvalidDateParameter: = "invalid-date-parameter"
@@ -1097,7 +1097,7 @@

InvalidDomainDialog

InvalidDomainDialog: = "invalid-dialog-domain"
@@ -1112,7 +1112,7 @@

InvalidFilterFieldName

InvalidFilterFieldName: = "invalid-filter-field-name"
@@ -1127,7 +1127,7 @@

InvalidFilterFieldValue

InvalidFilterFieldValue: = "invalid-filter-field-value"
@@ -1142,7 +1142,7 @@

InvalidParameter

InvalidParameter: = "invalid-parameter"
@@ -1157,7 +1157,7 @@

InvalidSelectionDate

InvalidSelectionDate: = "invalid-selection-date"
@@ -1172,7 +1172,7 @@

InvalidSelectionFieldName

InvalidSelectionFieldName: = "invalid-selection-field-name"
@@ -1187,7 +1187,7 @@

InvalidSelectionValue

InvalidSelectionValue: = "invalid-selection-value"
@@ -1202,7 +1202,7 @@

NullOrEmptyParameter

NullOrEmptyParameter: = "null-or-empty-parameter"
@@ -1217,7 +1217,7 @@

UnsupportedEventName

UnsupportedEventName: = "unsupported-event-name"
diff --git a/docs/enums/fieldaggregationtype.html b/docs/enums/fieldaggregationtype.html index 82877817..75a898ac 100644 --- a/docs/enums/fieldaggregationtype.html +++ b/docs/enums/fieldaggregationtype.html @@ -1099,7 +1099,7 @@

Attr

Attr: = "attr"
@@ -1109,7 +1109,7 @@

Avg

Avg: = "avg"
@@ -1119,7 +1119,7 @@

Count

Count: = "count"
@@ -1129,7 +1129,7 @@

Countd

Countd: = "countd"
@@ -1139,7 +1139,7 @@

Day

Day: = "day"
@@ -1149,7 +1149,7 @@

End

End: = "end"
@@ -1159,7 +1159,7 @@

Hour

Hour: = "hour"
@@ -1169,7 +1169,7 @@

InOut

InOut: = "in-out"
@@ -1179,7 +1179,7 @@

Kurtosis

Kurtosis: = "kurtosis"
@@ -1189,7 +1189,7 @@

Max

Max: = "max"
@@ -1199,7 +1199,7 @@

Mdy

Mdy: = "mdy"
@@ -1209,7 +1209,7 @@

Median

Median: = "median"
@@ -1219,7 +1219,7 @@

Min

Min: = "min"
@@ -1229,7 +1229,7 @@

Minute

Minute: = "minute"
@@ -1239,7 +1239,7 @@

Month

Month: = "month"
@@ -1249,7 +1249,7 @@

MonthYear

MonthYear: = "month-year"
@@ -1259,7 +1259,7 @@

None

None: = "none"
@@ -1269,7 +1269,7 @@

Qtr

Qtr: = "qtr"
@@ -1279,7 +1279,7 @@

Quart1

Quart1: = "quart1"
@@ -1289,7 +1289,7 @@

Quart3

Quart3: = "quart3"
@@ -1299,7 +1299,7 @@

Second

Second: = "second"
@@ -1309,7 +1309,7 @@

Skewness

Skewness: = "skewness"
@@ -1319,7 +1319,7 @@

Stdev

Stdev: = "stdev"
@@ -1329,7 +1329,7 @@

Stdevp

Stdevp: = "stdevp"
@@ -1339,7 +1339,7 @@

Sum

Sum: = "sum"
@@ -1349,7 +1349,7 @@

TruncDay

TruncDay: = "trunc-day"
@@ -1359,7 +1359,7 @@

TruncHour

TruncHour: = "trunc-hour"
@@ -1369,7 +1369,7 @@

TruncMinute

TruncMinute: = "trunc-minute"
@@ -1379,7 +1379,7 @@

TruncMonth

TruncMonth: = "trunc-month"
@@ -1389,7 +1389,7 @@

TruncQtr

TruncQtr: = "trunc-qtr"
@@ -1399,7 +1399,7 @@

TruncSecond

TruncSecond: = "trunc-second"
@@ -1409,7 +1409,7 @@

TruncWeek

TruncWeek: = "trunc-week"
@@ -1419,7 +1419,7 @@

TruncYear

TruncYear: = "trunc-year"
@@ -1429,7 +1429,7 @@

User

User: = "user"
@@ -1439,7 +1439,7 @@

Var

Var: = "var"
@@ -1449,7 +1449,7 @@

Varp

Varp: = "varp"
@@ -1459,7 +1459,7 @@

Week

Week: = "week"
@@ -1469,7 +1469,7 @@

Weekday

Weekday: = "weekday"
@@ -1479,7 +1479,7 @@

Year

Year: = "year"
diff --git a/docs/enums/fieldroletype.html b/docs/enums/fieldroletype.html index 1d78c8a9..bd628667 100644 --- a/docs/enums/fieldroletype.html +++ b/docs/enums/fieldroletype.html @@ -955,7 +955,7 @@

Dimension

Dimension: = "dimension"
@@ -965,7 +965,7 @@

Measure

Measure: = "measure"
@@ -975,7 +975,7 @@

Unknown

Unknown: = "unknown"
diff --git a/docs/enums/filterdomaintype.html b/docs/enums/filterdomaintype.html index a5546d32..22587bd7 100644 --- a/docs/enums/filterdomaintype.html +++ b/docs/enums/filterdomaintype.html @@ -951,7 +951,7 @@

Database

Database: = "database"
@@ -966,7 +966,7 @@

Relevant

Relevant: = "relevant"
diff --git a/docs/enums/filternulloption.html b/docs/enums/filternulloption.html index 9f023724..d307217f 100644 --- a/docs/enums/filternulloption.html +++ b/docs/enums/filternulloption.html @@ -956,7 +956,7 @@

AllValues

AllValues: = "all-values"
@@ -966,7 +966,7 @@

NonNullValues

NonNullValues: = "non-null-values"
@@ -976,7 +976,7 @@

NullValues

NullValues: = "null-values"
diff --git a/docs/enums/filtertype.html b/docs/enums/filtertype.html index ab8ce745..f013bc3c 100644 --- a/docs/enums/filtertype.html +++ b/docs/enums/filtertype.html @@ -959,7 +959,7 @@

Categorical

Categorical: = "categorical"
@@ -969,7 +969,7 @@

Hierarchical

Hierarchical: = "hierarchical"
@@ -979,7 +979,7 @@

Range

Range: = "range"
@@ -989,7 +989,7 @@

RelativeDate

RelativeDate: = "relative-date"
diff --git a/docs/enums/filterupdatetype.html b/docs/enums/filterupdatetype.html index 419d7fa8..7f21a6aa 100644 --- a/docs/enums/filterupdatetype.html +++ b/docs/enums/filterupdatetype.html @@ -959,7 +959,7 @@

Add

Add: = "add"
@@ -969,7 +969,7 @@

All

All: = "all"
@@ -979,7 +979,7 @@

Remove

Remove: = "remove"
@@ -989,7 +989,7 @@

Replace

Replace: = "replace"
diff --git a/docs/enums/marktype.html b/docs/enums/marktype.html index 3a4461d9..6365aa2c 100644 --- a/docs/enums/marktype.html +++ b/docs/enums/marktype.html @@ -987,7 +987,7 @@

Area

Area: = "area"
@@ -997,7 +997,7 @@

Bar

Bar: = "bar"
@@ -1007,7 +1007,7 @@

Circle

Circle: = "circle"
@@ -1017,7 +1017,7 @@

GanttBar

GanttBar: = "gantt-bar"
@@ -1027,7 +1027,7 @@

Line

Line: = "line"
@@ -1037,7 +1037,7 @@

Map

Map: = "map"
@@ -1047,7 +1047,7 @@

Pie

Pie: = "pie"
@@ -1057,7 +1057,7 @@

Polygon

Polygon: = "polygon"
@@ -1067,7 +1067,7 @@

Shape

Shape: = "shape"
@@ -1077,7 +1077,7 @@

Square

Square: = "square"
@@ -1087,7 +1087,7 @@

Text

Text: = "text"
diff --git a/docs/enums/parametervaluetype.html b/docs/enums/parametervaluetype.html index 5ccdd37c..dccbce4d 100644 --- a/docs/enums/parametervaluetype.html +++ b/docs/enums/parametervaluetype.html @@ -956,7 +956,7 @@

All

All: = "all"
@@ -966,7 +966,7 @@

List

List: = "list"
@@ -976,7 +976,7 @@

Range

Range: = "range"
diff --git a/docs/enums/periodtype.html b/docs/enums/periodtype.html index 6eba189a..078e24a8 100644 --- a/docs/enums/periodtype.html +++ b/docs/enums/periodtype.html @@ -975,7 +975,7 @@

Days

Days: = "days"
@@ -985,7 +985,7 @@

Hours

Hours: = "hours"
@@ -995,7 +995,7 @@

Minutes

Minutes: = "minutes"
@@ -1005,7 +1005,7 @@

Months

Months: = "months"
@@ -1015,7 +1015,7 @@

Quarters

Quarters: = "quarters"
@@ -1025,7 +1025,7 @@

Seconds

Seconds: = "seconds"
@@ -1035,7 +1035,7 @@

Weeks

Weeks: = "weeks"
@@ -1045,7 +1045,7 @@

Years

Years: = "years"
diff --git a/docs/enums/quicktablecalctype.html b/docs/enums/quicktablecalctype.html index b8614f0d..0c532209 100644 --- a/docs/enums/quicktablecalctype.html +++ b/docs/enums/quicktablecalctype.html @@ -984,7 +984,7 @@

CompoundGrowthRate

CompoundGrowthRate: = "compound-growth-rate"
@@ -994,7 +994,7 @@

Difference

Difference: = "difference"
@@ -1004,7 +1004,7 @@

MovingAverage

MovingAverage: = "moving-average"
@@ -1014,7 +1014,7 @@

PercentDifference

PercentDifference: = "percent-difference"
@@ -1024,7 +1024,7 @@

PercentOfTotal

PercentOfTotal: = "percent-of-total"
@@ -1034,7 +1034,7 @@

Percentile

Percentile: = "percentile"
@@ -1044,7 +1044,7 @@

Rank

Rank: = "rank"
@@ -1054,7 +1054,7 @@

RunningTotal

RunningTotal: = "running-total"
@@ -1064,7 +1064,7 @@

Undefined

Undefined: = "undefined"
@@ -1074,7 +1074,7 @@

YTDGrowth

YTDGrowth: = "ytd-growth"
@@ -1084,7 +1084,7 @@

YTDTotal

YTDTotal: = "ytd-total"
@@ -1094,7 +1094,7 @@

YearOverYearGrowth

YearOverYearGrowth: = "year-over-year-growth"
diff --git a/docs/enums/selectionupdatetype.html b/docs/enums/selectionupdatetype.html index a46900cf..d0b327d4 100644 --- a/docs/enums/selectionupdatetype.html +++ b/docs/enums/selectionupdatetype.html @@ -955,7 +955,7 @@

Add

Add: = "select-add"
@@ -965,7 +965,7 @@

Remove

Remove: = "select-remove"
@@ -975,7 +975,7 @@

Replace

Replace: = "select-replace"
diff --git a/docs/enums/sheettype.html b/docs/enums/sheettype.html index 54088847..7951ac29 100644 --- a/docs/enums/sheettype.html +++ b/docs/enums/sheettype.html @@ -955,7 +955,7 @@

Dashboard

Dashboard: = "dashboard"
@@ -965,7 +965,7 @@

Story

Story: = "story"
@@ -975,7 +975,7 @@

Worksheet

Worksheet: = "worksheet"
diff --git a/docs/enums/sortdirection.html b/docs/enums/sortdirection.html index f7857c22..fb15519c 100644 --- a/docs/enums/sortdirection.html +++ b/docs/enums/sortdirection.html @@ -944,7 +944,7 @@

Decreasing

Decreasing: = "decreasing"
@@ -954,7 +954,7 @@

Increasing

Increasing: = "increasing"
diff --git a/docs/enums/tableaueventtype.html b/docs/enums/tableaueventtype.html index 0f111d65..e3cc74a1 100644 --- a/docs/enums/tableaueventtype.html +++ b/docs/enums/tableaueventtype.html @@ -955,7 +955,7 @@

FilterChanged

FilterChanged: = "filter-changed"
@@ -970,7 +970,7 @@

MarkSelectionChanged

MarkSelectionChanged: = "mark-selection-changed"
@@ -985,7 +985,7 @@

ParameterChanged

ParameterChanged: = "parameter-changed"
diff --git a/docs/enums/trendlinemodeltype.html b/docs/enums/trendlinemodeltype.html index 88c9f9f9..6b520e2f 100644 --- a/docs/enums/trendlinemodeltype.html +++ b/docs/enums/trendlinemodeltype.html @@ -952,7 +952,7 @@

Exponential

Exponential: = "exponential"
@@ -962,7 +962,7 @@

Linear

Linear: = "linear"
@@ -972,7 +972,7 @@

Logarithmic

Logarithmic: = "logarithmic"
@@ -982,7 +982,7 @@

Polynomial

Polynomial: = "polynomial"
diff --git a/docs/globals.html b/docs/globals.html index f6e2dc41..6de827b7 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -922,9 +922,6 @@
  • DateRangeType
  • -
  • - DialogEventType -
  • EncodingType
  • @@ -1027,6 +1024,9 @@
  • DataValue
  • +
  • + DialogOptions +
  • DualAxisPair
  • @@ -1042,9 +1042,6 @@
  • Extensions
  • -
  • - ExtensionsDialog -
  • Field
  • @@ -1183,7 +1180,6 @@

    Enumerations

  • DashboardObjectType
  • DataType
  • DateRangeType
  • -
  • DialogEventType
  • EncodingType
  • ErrorCodes
  • ExtensionContext
  • @@ -1223,12 +1219,12 @@

    Interfaces

  • DataSourceUnderlyingDataOptions
  • DataTable
  • DataValue
  • +
  • DialogOptions
  • DualAxisPair
  • Encoding
  • Environment
  • EventListenerManager
  • Extensions
  • -
  • ExtensionsDialog
  • Field
  • Filter
  • FilterChangedEvent
  • diff --git a/docs/index.html b/docs/index.html index 7aab6869..a3657236 100644 --- a/docs/index.html +++ b/docs/index.html @@ -922,9 +922,6 @@
  • DateRangeType
  • -
  • - DialogEventType -
  • EncodingType
  • @@ -1027,6 +1024,9 @@
  • DataValue
  • +
  • + DialogOptions +
  • DualAxisPair
  • @@ -1042,9 +1042,6 @@
  • Extensions
  • -
  • - ExtensionsDialog -
  • Field
  • @@ -1179,7 +1176,6 @@

    Enumerations

  • DashboardObjectType
  • DataType
  • DateRangeType
  • -
  • DialogEventType
  • EncodingType
  • ErrorCodes
  • ExtensionContext
  • @@ -1219,12 +1215,12 @@

    Interfaces

  • DataSourceUnderlyingDataOptions
  • DataTable
  • DataValue
  • +
  • DialogOptions
  • DualAxisPair
  • Encoding
  • Environment
  • EventListenerManager
  • Extensions
  • -
  • ExtensionsDialog
  • Field
  • Filter
  • FilterChangedEvent
  • diff --git a/docs/interfaces/extensions.html b/docs/interfaces/extensions.html index d3d57ec4..fbaf71ef 100644 --- a/docs/interfaces/extensions.html +++ b/docs/interfaces/extensions.html @@ -925,6 +925,9 @@
  • initializeAsync
  • +
  • + initializeDialogAsync +
  • @@ -964,6 +967,7 @@

    Properties

    Methods

    @@ -977,7 +981,7 @@

    Optional dashboardContent
    dashboardContent: DashboardContent
    @@ -992,7 +996,7 @@

    environment

    environment: Environment
    @@ -1007,7 +1011,7 @@

    settings

    settings: Settings
    @@ -1022,7 +1026,7 @@

    ui

    ui: UI
    @@ -1044,18 +1048,42 @@

    initializeAsync

  • +
    +
    +

    This is the entry point for an Extension. This function must first be called + in order to interact with any of the other Extension APIs.

    +
    +
    +

    Returns Promise<void>

    +

    A promise that when resolved, the other Extension APIs will be available to use.

    +
  • + + +
    + +

    initializeDialogAsync

    +
      +
    • initializeDialogAsync(): Promise<void>
    • +
    +
      +
    • +
      -

      This is the entry point for an Extensions. This function must first be called - in order to interact with any of the other Extensions APIs.

      +

      This is the entry point for an extension that runs inside a dialog created by the + UI namespace. This function must be called first in order to use the rest of the Extension + API, and should not be called by extensions that are not displayed in a dialog.

      Returns Promise<void>

      -

      A promise that the developer must run to initiailze their extension. - When resolved, the other Extensions APIs will be available to use.

      +

      A promise that when resolved, the other Extension APIs will be available to use.

    diff --git a/docs/interfaces/ui.html b/docs/interfaces/ui.html index d04bab93..991a074c 100644 --- a/docs/interfaces/ui.html +++ b/docs/interfaces/ui.html @@ -911,10 +911,10 @@ UI @@ -924,14 +924,13 @@
    -
    -
    notimplemented
    -

    This namesapce contains functionality that allows an Extensions to display a popup - dialog window, and communicate between that window and the parent Extensions. This can - be useful in auth scenarios and when extra situational UI space is needed. - Only one dialog can be displayed at a time.

    -
    -
    +
    +

    This namespace contains functionality that allows an Extension to display a popup + dialog window. This can be useful in auth scenarios and when extra situational UI space is needed. + Only one dialog can be displayed at a time per extension. Inside the popup dialog window, + another extension can be loaded and run. This 'dialog extension' will have full access + to the functions provided by the Extensions API.

    +
    @@ -949,8 +948,8 @@

    Index

    Methods

    @@ -959,80 +958,78 @@

    Methods

    Methods

    - -

    displayDialogAsync

    + +

    closeDialog

      -
    • displayDialogAsync(url: string, height?: number, width?: number): Promise<ExtensionsDialog>
    • +
    • closeDialog(payload?: string): void
    • -
      -
      notimplemented
      -
      -
      +
      +

      Called from dialog extension in order to close itself.

      +

      Parameters

      • -
        url: string
        -
        -

        The url to navigate to in the popup dialog. The Dialog url must - belong to the same domain as the parent Extensions.

        -
        -
      • -
      • -
        Optional height: number
        -
        -

        Optional height the dialog should try and open with.

        -
        -
      • -
      • -
        Optional width: number
        +
        Optional payload: string
        -

        Optional width the dialog should try and open with.

        +

        optional data to make available to parent extension when this dialog closes.

      -

      Returns Promise<ExtensionsDialog>

      -

      A promise resolving to an ExtensionsDialog.

      +

      Returns void

    - -

    messageParentExtensions

    + +

    displayDialogAsync

      -
    • messageParentExtensions(message: string): void
    • +
    • displayDialogAsync(url: string, payload?: string, dialogOptions?: DialogOptions): Promise<string>
    • -
      -
      notimplemented.
      -
      -

      Parameters

      • -
        message: string
        +
        url: string
        +
        +

        The url of the 'dialog extension' to navigate to in the dialog. The url must + belong to the same domain as the parent extension.

        +
        +
      • +
      • +
        Optional payload: string
        -

        The message to send from an Extensions's dialog to its parent frame.

        +

        optional data to make available to dialog on startup. This will be returned + to the dialog extension as the return value of tableau.extensions.ui.initializeDialogAsync

        +
        +
      • +
      • +
        Optional dialogOptions: DialogOptions
        +
        +

        configuration options for the dialog appearance

      -

      Returns void

      +

      Returns Promise<string>

      +

      A promise that resolves when the dialog has been closed. It will contain a + payload as a string provided by the dialog extension. The promise is rejected if + the user manually closes the dialog (for example, by clicking the 'x').

    diff --git a/docs/trex_create.md b/docs/trex_create.md index bacf04c1..ac527a21 100644 --- a/docs/trex_create.md +++ b/docs/trex_create.md @@ -80,10 +80,10 @@ The web app you create controls and interacts with the Tableau dashboard objects Your web application must include an HTML page. This page should link to the Extensions API JavaScript library and to any other JavaScript, CSS, or HTML resources your web app requires. -1. In the HTML page, add a link to the JavaScript library (for example, `tableau-extensions-0.7.0.js`). +1. In the HTML page, add a link to the JavaScript library (for example, `tableau-extensions-0.8.0.js`). ``` - + ``` 2. Add links to additional JavaScript files and code that you need. You could add the JavaScript code to initialize and call Extensions API functions directly in the HTML page. However, in most cases you want to keep this code in a separate file. The following code is from a simple sample. ```html @@ -103,7 +103,7 @@ Your web application must include an HTML page. This page should link to the Ext - + diff --git a/docs/trex_getstarted.md b/docs/trex_getstarted.md index 502ca263..0dd1a863 100644 --- a/docs/trex_getstarted.md +++ b/docs/trex_getstarted.md @@ -78,27 +78,19 @@ To use the dashboard extension samples, you need to start up a web server on you ---- -### Install the dashboard extension manifest file (`.trex`) - - -Every Tableau extension has a manifest file (`.trex`) that describes the extension and identifies the location of the web application. - -1. Close Tableau, if you have it opened. -2. Copy the `.trex` files of the samples you wish to run to `~\Documents\My Tableau Repository (Beta)\Extensions` so they are available to Tableau. - The `.trex` files for the samples can be found in the folder with the samples. For example, `\extensions-api\Samples\DataSources\DataSources.trex`. - - - --- ### Start Tableau and add an extension to the dashboard 1. Start Tableau and open a workbook that has a dashboard, or open a workbook and create a new dashboard. -2. In the dashboard, under **Extensions**, select one of the sample extensions and drag it on to the dashboard. For example, drag **DataSources Sample** to the dashboard. - ![]({{site.baseurl}}/assets/frelard_extensions1.png) - +2. In the dashboard, under **Objects**, select **Extension** and drag it on to the dashboard. + ![]({{site.baseurl}}/assets/frelard_objects_extension.png) + +3. In the **Select an Extension** dialog box, click **Choose an Extension**. + Every Tableau extension has a manifest file (`.trex`) that describes the extension and identifies the location of the web application. +4. Browse to the directory where the samples are located. For example, if you downloaded or cloned the GitHub repository, go to `\extensions-api\Samples`. +5. Open the `DataSources.trex` file. The sample extension (web application) appears in the dashboard frame. The DataSources sample finds and displays the data source for each worksheet in the dashboard. -3. In the DataSources extension, click the **Info** (**i**) button. This action opens a dialog box that displays more details about the selected data source. +6. In the DataSources extension, click the **Info** (**i**) button. This action opens a dialog box that displays more details about the selected data source. ![]({{site.baseurl}}/assets/data_source.gif) diff --git a/docs/trex_manifest.md b/docs/trex_manifest.md index f0cb99f0..23aa1231 100644 --- a/docs/trex_manifest.md +++ b/docs/trex_manifest.md @@ -39,7 +39,7 @@ If a workbook is saved with an extension and then later opened on another comput 1.1 - SERVER:PORT/PATH + SCHEME://SERVER[:PORT][/PATH] Base64-Encoded ICON @@ -106,7 +106,7 @@ If a workbook is saved with an extension and then later opened on another comput url -Specifies the name and port (optional) of the server. The url must use HTTPS. For example: https://example.com/extension. +Specifies the scheme (HTTPS, HTTTP), the name of the server, the port (optional) and the path to extension (optional). The url must use HTTPS. For example: https://example.com/extension. The exception is for localhost. In this case, HTTP is allowed. For example: http://localhost:8080. diff --git a/docs/trex_release-notes.md b/docs/trex_release-notes.md index eb89e0cd..87982f4e 100644 --- a/docs/trex_release-notes.md +++ b/docs/trex_release-notes.md @@ -8,6 +8,45 @@ layout: docs * TOC {:toc} +--- + +### Developer Preview (0.8.0) +*December 21, 2017* + +- Update of the Tableau Extensions API. +- Tableau Extensions API library: `tableau-extensions-0.8.0.js` +- Tableau Desktop 10.5 RC, Tableau Server 10.5 (from [Extensions API Developer Preview](https://prerelease.tableau.com){:target="_blank"}) + + +**New desktop authoring experience** + +You no longer need to place the `.trex` file for the extension in a predetermined folder, you now do the following: + + 1. In the dashboard, under **Objects** on the left, select **Extension** and drag it to the dashboard sheet on the right. + The **Select an Extension** dialog box appears. + 2. The first time you open the dialog box to add an extension, you will see a link to **Choose an Extension**. Click the link and browse to the directory where you have the `.trex` file. +Subsequently, when you drag the **Extension** on the dashboard, the dialog box shows you the most recently used list, choose from the list, or click **Browse** to select another extension. + +**New UI namespace** + +- You can now launch a new modal dialog using the function: `tableau.extensions.ui.displayDialogAsync(dialonExtensionURL)`. +- The URL you want to load (`dialonExtensionURL`) will be an extension itself. +- The extension in the dialog will have full access to the extensions API. When ready to close to the dialog, from the dialog extension you can call `tableau.extensions.ui.closeDialog(string)`. See the documentation for details. +- Note that the UI namespace is work is still in progress and has some upcoming additions. *Stay tuned for more.* + +**HTTPS and security** + +For information about the HTTPS requirements for extensions, see [Security and Tableau Extensions]({{site.baseurl}}/docs/trex_security.html) + +**Remote Debugging** + +Due to changes in this release, remote debugging does not work as expected in Tableau Desktop. To enable debugging, you must add the `--remote-debugging-port=8696` option to the command used to start Tableau. The easiest way to do this is to open the Tableau shortcut on the **Start** menu. Open the file location of the Tableau shortcut. Right-click the Tableau shortcut and click **Properties**. In the Target text box, append the remote debugging option to the command. Do not enclose the option in quotation marks. +``` + "C:\Program Files\Tableau\Tableau main\bin\tableau.exe" --remote-debugging-port=8696 +``` +For information about debugging extensions, see [Remote Debugging of JavaScript and HTML]({{site.baseurl}}/docs/trex_debugging.html). + + --- ### Developer Preview (0.7.0) diff --git a/docs/trex_security.md b/docs/trex_security.md new file mode 100644 index 00000000..f5a377f6 --- /dev/null +++ b/docs/trex_security.md @@ -0,0 +1,207 @@ +--- +title: Security and Tableau Extensions +layout: docs +--- + +A Tableau extension is essentially a web application that runs inside a Tableau dashboard. The extension can interact with other components in the dashboard and potentially has access to the visible and underlying data in the workbook (through a well-defined API). In addition, the web application can be running code on a server that sits outside of the domain where Tableau Server or Tableau Desktop are located. For security, Tableau requires the following: + +- All extensions must use the HTTP Secure (HTTPS) protocol. + +- To run on Tableau Server, the URL of the extension must be added to a safe list. The Tableau Server site administrator manages this list. + +- By default, anyone using the extension will be prompted and asked to allow or deny the extension access. The Tableau Server site administrator can control whether the prompt appears for each extension. + + +This section covers options for setting up your extension to use HTTPS. For information about adding an extension to the safe list on Tableau Server, or how to configure the prompts to allow or deny access, see the Tableau Server documentation (*work in progress*). + + +**In this section** + +* TOC +{:toc} + + +--- +## Why HTTPS? + +When you use HTTPS, all HTTP data is encrypted prior to transmission by the Transport Layer Security (TLS) and decrypted when it is received. HTTPS ensures a secure channel between the extension (client), running in the Tableau dashboard, and the web server that hosts the extension. The use of HTTPS provides a level of privacy, authentication, and integrity. + +If you plan to make your extension available to others, using HTTPS + assures your customers that their data is safe and that they are connecting to trusted extension. Because the extension is using HTTPS, Tableau is also able to verify the identity of the server that hosts the extension, which prevents various malicious man-in-the-middle attacks that could occur if the extension were to use HTTP alone. + +> Note: For development or internal use, you can run your extension on your local computer as `localhost` and you can use the HTTP protocol. + + + +--- +## HTTPS and security requirements +The requirements are pretty straight-forward. If you are distributing your extension so that others can use it, the extension must be hosted on a web server that is configured to support the HTTPS protocol. + +- The server that hosts your extension must have a certificate from a Certificate Authority (CA). There are many free and low cost options. Note that self-signed or test-signed certificates are not sufficient. The certificate is sometimes called an SSL certificate, as HTTPS was formerly implemented by the Secure Sockets Layer (SSL). +- In the `.trex` file for your extension, the `url` you use for the source location must start with `https://`. If the HTTPS protocol is not specified, the extension fails registration and does not appear in list of available extensions in Tableau. +The exception to this requirement is for `localhost`. If you are developing your extension, you can host it on your computer using HTTP (for example, `http://localhost`). You can also use `http://localhost` if you publish the workbook to Tableau Server. In this case, the extension must be running on the same computer as the browser you are using to access the server. +- Mixed content is not allowed. If your web application uses other libraries or resources, those assets should also use `https`, or use site-relative links. +- Redirects are permitted, but if they redirect to any other origin, other than the URL of the extension, those pages cannot interact with the Extensions API. For example, if the URL of your extension is `https://example.com` and you redirect to `https://myexample.com`, the page you were redirecting to (`https://myexample.com`) cannot interact with the Extensions API. +- To run on Tableau Server, your extension must be added to the safe list for the site. Site administrators can add or remove extensions, and can configure how an extension requests permissions for access to data. + +---- + +## Setting the source location in the .trex file + +The source location of the extension is its URL. You specify the URL in the extension manifest (`.trex`) file. The syntax includes the name of the server, which includes the protocol (HTTPS, HTTP), the port used, if any, and the path to the extension web page (optional). + +The `` element in the `.trex` file, looks like the following: + +```xml + + SCHEME://SERVER[:PORT][/PATH] + + +``` + +For example, if the extension is hosted on example.com, the entry might look like the following: + +```xml + + https://example.com:4043/extension + + + +``` + +Or during development, when you can use `localhost`, the entry might look like the following: + +```xml + + + http://localhost:8080/extension + + + +``` +At startup, Tableau looks for and validates the extension `.trex` files. If the extension source location does not specify HTTPS or localhost, validation fails and the extension is not registered. These errors are written to the log file. The extension will not appear in the list of available extensions. If you examine the log files (for example, with Tableau Log Viewer), you will find something similar to the following: + +``` +Error: Registration Failed: XSD Validation Failed +file: Example.trex + + +Error: Error(11,67): value 'http://example.com/example.html' does not match regular expression facet '[Hh][Tt][Tt][Pp][Ss]://.+|[Hh][Tt][Tt][Pp]://[Ll][Oo][Cc][Aa][Ll][Hh][Oo][Ss][Tt]|[Hh][Tt][Tt][Pp]://[Ll][Oo][Cc][Aa][Ll][Hh][Oo][Ss][Tt][:/].*' (id: C:\Users\\Documents\My Tableau Repository (Beta)\Extensions\example.trex) +file: Example.trex + + +``` + + +## Avoid mixed content - use HTTPS or site-relative paths for resources + +The extension should not call any pages over HTTP. If you reference libraries or resources, specify `https` for the files you include. + +For example: + +```html + + + + + + + + + + + + +``` + + +Or use site-relative or protocol-agnostic links (that is, where the protocol is not specified). + +```html + + + + + + + +``` + + +## Use HTTP and localhost for development or internal use + +While HTTPS is required, during development, you can run a web server on your local computer (`localhost`) to host the extension over HTTP. This exception also applies to Tableau Server. + +For example, you can author a workbook in Tableau Desktop that uses an extension (running as `localhost` on same computer as Tableau Desktop). You can then publish that workbook to Tableau Server. The extension must be running on the same computer as the browser that you are using to connect to Tableau Server. The `localhost` is local to the browser. For example, the source location of an extension might be `http://localhost:8080/extension`. If you publish that extension to Tableau Server, other users can view the dashboard and extension, provided that they also have a local copy of the extension hosted on their computers and the extension is using the same URL. + +Note the following considerations: + +- If Tableau Server is using HTTPS, your extension won't work with `http://localhost`. This is because you can't embed an HTTP `