Ignore:
Timestamp:
Jun 17, 2024, 5:25:43 PM (5 months ago)
Author:
alloc
Message:

1.1.0.1 Release for V 1.0

Location:
TFP-WebServer/MarkersMod
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • TFP-WebServer/MarkersMod/MarkersMod.csproj

    r469 r487  
    6363      <Private>False</Private>
    6464    </Reference>
    65     <Reference Include="Utf8Json, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
     65    <Reference Include="Utf8Json">
    6666      <HintPath>..\7dtd-binaries\Utf8Json.dll</HintPath>
    6767      <Private>False</Private>
     
    6969  </ItemGroup>
    7070  <ItemGroup>
     71    <Compile Include="src\MarkerData.cs" />
    7172    <Compile Include="src\ModApi.cs" />
    7273    <Compile Include="src\AssemblyInfo.cs" />
  • TFP-WebServer/MarkersMod/ModInfo.xml

    r485 r487  
    55        <Description value="Allows placing custom markers on the web map" />
    66        <Author value="Catalysm and Alloc" />
    7         <Version value="22.0.1.0" />
     7        <Version value="1.1.0.0" />
    88        <Website value="" />
    99</xml>
  • TFP-WebServer/MarkersMod/WebMod/bundle.js

    r485 r487  
    1515  LayersControl,
    1616  Marker,
     17  Tooltip,
    1718  HideBasedOnAuth,
    1819  L
     
    4546              lng: y
    4647            }
    47           });
     48          }, /*#__PURE__*/React.createElement(Tooltip, null, marker.name));
    4849        });
    4950        setMarkers(markerComponents);
     
    8283    formState: {
    8384      errors
    84     }
     85    },
     86    setValue
    8587  } = useForm();
    8688  const {
     
    9193    mutate: createMarker
    9294  } = useMutation('createMarker', data => HTTP.post('/api/markers', {
     95    name: data.name,
    9396    x: parseInt(data.x, 10),
    9497    y: parseInt(data.y, 10)
     
    104107    mutate: updateMarker
    105108  } = useMutation('updateMarker', data => HTTP.put(`/api/markers/${data.id}`, {
     109    name: data.name,
    106110    x: parseInt(data.x, 10),
    107111    y: parseInt(data.y, 10),
     
    114118    method: 'PUT'
    115119  });
     120  const canDeleteRows = checkPermission({
     121    module: 'webapi.Markers',
     122    method: 'DELETE'
     123  });
    116124  const columnDef = [{
    117125    field: 'id',
    118126    filter: 'agTextColumnFilter',
    119     checkboxSelection: true,
    120     width: 300,
    121     flex: 0
     127    flex: 1
     128  }, {
     129    field: 'name',
     130    filter: 'agTextColumnFilter',
     131    flex: 1
    122132  }, {
    123133    field: 'x',
    124134    filter: 'agNumberColumnFilter',
    125     editable: canEditRows,
    126     cellEditorPopup: true,
    127     width: 50,
    128     flex: 0
     135    flex: 0.25,
     136    sort: 'asc'
    129137  }, {
    130138    field: 'y',
    131139    filter: 'agNumberColumnFilter',
    132     editable: canEditRows,
    133     cellEditorPopup: true,
    134     width: 50,
    135     flex: 0
     140    flex: 0.25,
     141    sort: 'asc'
    136142  }, {
    137143    field: 'icon',
    138144    filter: 'agTextColumnFilter',
    139     editable: canEditRows,
    140     cellEditorPopup: true,
    141145    flex: 1
    142146  }];
    143   const CreateMarker = () => {
     147  const Form = /*#__PURE__*/React.createElement(TfpForm, {
     148    id: "markers-form",
     149    error: errors
     150  }, /*#__PURE__*/React.createElement(FormElements.StyledFormItem, null, /*#__PURE__*/React.createElement(FormElements.FormLabel, {
     151    htmlFor: "input-id"
     152  }, "ID"), /*#__PURE__*/React.createElement(FormElements.FormInput, _extends({
     153    key: "id",
     154    id: "input-id"
     155  }, register('id'), {
     156    disabled: true
     157  }))), /*#__PURE__*/React.createElement(FormElements.StyledFormItem, null, /*#__PURE__*/React.createElement(FormElements.FormLabel, {
     158    htmlFor: "input-name"
     159  }, "Name"), /*#__PURE__*/React.createElement(FormElements.FormInput, _extends({
     160    key: "name",
     161    id: "input-name"
     162  }, register('name')))), /*#__PURE__*/React.createElement(FormElements.StyledFormItem, null, /*#__PURE__*/React.createElement(FormElements.FormLabel, {
     163    htmlFor: "input-x"
     164  }, "X"), /*#__PURE__*/React.createElement(FormElements.FormInput, _extends({
     165    key: "x",
     166    id: "input-x"
     167  }, register('x', {
     168    required: true
     169  })))), /*#__PURE__*/React.createElement(FormElements.StyledFormItem, null, /*#__PURE__*/React.createElement(FormElements.FormLabel, {
     170    htmlFor: "input-y"
     171  }, "Y"), /*#__PURE__*/React.createElement(FormElements.FormInput, _extends({
     172    key: "y",
     173    id: "input-y"
     174  }, register('y', {
     175    required: true
     176  })))));
     177  async function handleCreate(data) {
    144178    if (!checkPermission({
    145179      module: 'webapi.Markers',
    146180      method: 'POST'
    147181    })) {
    148       return null;
    149     }
    150     return /*#__PURE__*/React.createElement(TfpForm, {
    151       id: "markers-form",
    152       handleSubmit: handleSubmit(createMarker),
    153       error: errors
    154     }, /*#__PURE__*/React.createElement(FormElements.StyledFormItem, null, /*#__PURE__*/React.createElement(FormElements.FormLabel, {
    155       htmlFor: "input-x"
    156     }, "X"), /*#__PURE__*/React.createElement(FormElements.FormInput, _extends({
    157       key: "x",
    158       id: "input-x"
    159     }, register('x', {
    160       required: true
    161     })))), /*#__PURE__*/React.createElement(FormElements.StyledFormItem, null, /*#__PURE__*/React.createElement(FormElements.FormLabel, {
    162       htmlFor: "input-y"
    163     }, "Y"), /*#__PURE__*/React.createElement(FormElements.FormInput, _extends({
    164       key: "y",
    165       id: "input-y"
    166     }, register('y', {
    167       required: true
    168     })))));
    169   };
    170   async function cellEdited({
    171     data,
    172     newValue,
    173     column
    174   }) {
     182      return;
     183    }
     184    createMarker(data);
     185  }
     186  async function handleEdit(data) {
    175187    if (!checkPermission({
    176188      module: 'webapi.Markers',
     
    179191      return;
    180192    }
    181     const changedField = column.colId;
    182     updateMarker({
    183       ...data,
    184       [changedField]: newValue
    185     });
     193    updateMarker(data);
    186194  }
    187195  async function cellDeleted(row) {
     
    194202    deleteMarker(row.id);
    195203  }
     204  const setDefaultValues = data => {
     205    setValue('id', data.id);
     206    setValue('name', data.name);
     207    setValue('x', data.x);
     208    setValue('y', data.y);
     209  };
    196210  return /*#__PURE__*/React.createElement("div", {
    197211    style: {
     
    199213      height: '80vh'
    200214    }
    201   }, /*#__PURE__*/React.createElement(CreateMarker, null), /*#__PURE__*/React.createElement(EditableTable, {
     215  }, /*#__PURE__*/React.createElement(EditableTable, {
    202216    columnDef: columnDef,
    203217    rowData: data,
    204218    reloadFn: refetch,
    205     editRowFn: cellEdited,
    206219    deleteRowFn: cellDeleted,
    207     height: '90%'
     220    canDeleteRows: canDeleteRows,
     221    height: '90%',
     222    editRowFn: handleSubmit(handleEdit),
     223    editForm: Form,
     224    setDefaultValues: setDefaultValues,
     225    canEditRows: canEditRows,
     226    canCreateRows: canEditRows,
     227    createRowFn: handleSubmit(handleCreate)
    208228  }));
    209229}
  • TFP-WebServer/MarkersMod/src/Markers.cs

    r459 r487  
    1515                        "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Blue_question_mark_icon.svg/1200px-Blue_question_mark_icon.svg.png";
    1616               
    17                 private readonly Dictionary<string, (int, int, string)> markers = new Dictionary<string, (int, int, string)> ();
     17                private readonly Dictionary<string, MarkerData> markers = new Dictionary<string, MarkerData> ();
    1818
    1919                public Markers () {
     
    2424                                int y = random.RandomRange (-1000, 1001);
    2525
    26                                 markers.Add (WebUtils.GenerateGuid (), (x, y, null));
     26                                string guid = WebUtils.GenerateGuid ();
     27                                markers.Add (guid, new MarkerData(guid, new Vector2i (x, y), "RandomMarker " + i, null));
    2728                        }
    2829                       
     
    3334                private static readonly byte[] jsonKeyX = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("x");
    3435                private static readonly byte[] jsonKeyY = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("y");
     36                private static readonly byte[] jsonKeyName = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("name");
    3537                private static readonly byte[] jsonKeyIcon = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("icon");
    3638
     
    4446
    4547                                bool first = true;
    46                                 foreach ((string markerId, (int, int, string) properties) in markers) {
     48                                foreach ((_, MarkerData iMarker) in markers) {
    4749                                        if (!first) {
    4850                                                writer.WriteValueSeparator ();
     
    5153                                        first = false;
    5254                                       
    53                                         writeMarkerJson (ref writer, markerId, properties);
     55                                        writeMarkerJson (ref writer, iMarker);
    5456                                }
    5557
     
    5961                        }
    6062
    61                         if (!markers.TryGetValue (id, out (int, int, string) properties2)) {
     63                        if (!markers.TryGetValue (id, out MarkerData singleMarker)) {
    6264                                writer.WriteRaw (WebUtils.JsonEmptyData);
    6365                                SendEnvelopedResult (_context, ref writer, HttpStatusCode.NotFound);
     
    6870                                writer.WriteBeginArray ();
    6971                               
    70                                 writeMarkerJson (ref writer, id, properties2);
     72                                writeMarkerJson (ref writer, singleMarker);
    7173                               
    7274                                writer.WriteEndArray ();
     
    7577                }
    7678
    77                 private void writeMarkerJson (ref JsonWriter _writer, string _markerId, (int, int, string) _properties) {
     79                private void writeMarkerJson (ref JsonWriter _writer, MarkerData _marker) {
    7880                        _writer.WriteRaw (jsonKeyId);
    79                         _writer.WriteString (_markerId);
     81                        _writer.WriteString (_marker.Id);
    8082                        _writer.WriteRaw (jsonKeyX);
    81                         (int x, int y, string icon) = _properties;
    82                         _writer.WriteInt32 (x);
     83                        _writer.WriteInt32 (_marker.Position.x);
    8384                        _writer.WriteRaw (jsonKeyY);
    84                         _writer.WriteInt32 (y);
     85                        _writer.WriteInt32 (_marker.Position.y);
     86                        _writer.WriteRaw (jsonKeyName);
     87                        _writer.WriteString (_marker.Name);
    8588                        _writer.WriteRaw (jsonKeyIcon);
    86                         _writer.WriteString (icon ?? defaultIcon);
     89                        _writer.WriteString (_marker.Icon ?? defaultIcon);
    8790                        _writer.WriteEndObject ();
    8891                }
     
    99102                        }
    100103
     104                        JsonCommons.TryGetJsonField (_jsonInput, "name", out string name);
     105                        if (string.IsNullOrEmpty (name)) {
     106                                name = null;
     107                        }
     108
    101109                        JsonCommons.TryGetJsonField (_jsonInput, "icon", out string icon);
    102110                        if (string.IsNullOrEmpty (icon)) {
     
    105113
    106114                        string newId = WebUtils.GenerateGuid ();
    107                         markers.Add (newId, (x, y, icon));
     115                        markers.Add (newId, new MarkerData(newId, new Vector2i (x, y), name, icon));
    108116
    109117                        PrepareEnvelopedResult (out JsonWriter writer);
     
    123131                        }
    124132
    125                         bool keepIcon = !_jsonInput.TryGetValue ("icon", out _);
    126                         JsonCommons.TryGetJsonField (_jsonInput, "icon", out string icon);
    127                         if (string.IsNullOrEmpty (icon)) {
    128                                 icon = null;
    129                         }
     133                        bool keepName = !JsonCommons.TryGetJsonField (_jsonInput, "name", out string name);
     134
     135                        bool keepIcon = !JsonCommons.TryGetJsonField (_jsonInput, "icon", out string icon);
    130136
    131137                        string id = _context.RequestPath;
    132138
    133                         if (!markers.TryGetValue (id, out (int, int, string) properties)) {
     139                        if (!markers.TryGetValue (id, out MarkerData oldMarker)) {
    134140                                SendEmptyResponse (_context, HttpStatusCode.NotFound, _jsonInputData, "ID_NOT_FOUND");
    135141                                return;
    136142                        }
    137143
     144                        if (keepName) {
     145                                name = oldMarker.Name;
     146                        }
     147                       
    138148                        if (keepIcon) {
    139                                 icon = properties.Item3;
     149                                icon = oldMarker.Icon;
    140150                        }
    141                         markers [id] = (x, y, icon);
     151
     152                        MarkerData updatedMarker = new MarkerData(id, new Vector2i (x, y), name, icon);
     153                        markers [id] = updatedMarker;
    142154
    143155                        PrepareEnvelopedResult (out JsonWriter writer);
    144                         writer.WriteRaw (jsonKeyId);
    145                         writer.WriteString (id);
    146                         writer.WriteRaw (jsonKeyX);
    147                         writer.WriteInt32 (x);
    148                         writer.WriteRaw (jsonKeyY);
    149                         writer.WriteInt32 (y);
    150                         writer.WriteRaw (jsonKeyIcon);
    151                         writer.WriteString (icon);
    152                         writer.WriteEndObject ();
     156                        writeMarkerJson (ref writer, updatedMarker);
    153157                        SendEnvelopedResult (_context, ref writer);
    154158                }
  • TFP-WebServer/MarkersMod/src/Markers.openapi.yaml

    r460 r487  
    2424          examples:
    2525            - 321
     26        name:
     27          type:
     28            - string
     29            - 'null'
     30          examples:
     31            - My House
     32          description: Name shown with the marker
    2633        icon:
    2734          type:
     
    3643        - x
    3744        - y
     45        - name
     46        - icon
    3847
    3948    MarkersList:
     
    5867                examples:
    5968                  - 842
     69              name:
     70                type:
     71                  - string
     72                  - 'null'
     73                examples:
     74                  - My House
    6075              icon:
    61                 type: string
     76                type:
     77                  - string
     78                  - 'null'
    6279                format: uuid
    6380                examples:
Note: See TracChangeset for help on using the changeset viewer.