Meld afterReturn advice is getting called before promise is resolved

AfterReturning and After is getting called when promise is in pending State before it reaches fulfilled or rejected State
In my method abc i am calling an other promise waiting for it resolve and then resolve this
// In page service.js
module.exports.abc = (a, b) => {
 return new Promise((resolve, reject) => {
   // This calls a a promise in an other page
     var xyz = xyzDao.getValues();
     xyz.then((response) => {
         console.log("beforeResolve");
         resolve(response);
         console.log("beforeResolve");
     })
  })
}

//In Page MeldService
var meld = require('meld');
var service = require('service')
let advice = {
    before: function() {
       let joinPointObj = meld.joinpoint()

      console.log("In Before of ",joinPointObj.method)
    },
  afterReturning: function(returningValue){
       let joinPointObj = meld.joinpoint()
      console.log("In After Returning of ", joinPointObj.method);
      console.log(returningValue);
  }
}

meld(service, ['abc'], advice);

In my logs
In Before of abc
In After Returning of abc
Promise { <pending> }
Before Resolve
After Resolve

Hi @santhoshsk1918.  Meld doesn't provide builtin async advice.  That basically means meld doesn't treat promises specially, i.e. the promise (rather than the promise's fulfillment value) is the return value.  You can, however build your own async advices on top of the functions meld provides.
Here's a very simple example of how you might implement your own "after fulfilling" advice:
function afterFulfilling (target, method, advice) {
    function applyAfterFulfilling (joinpoint) {
        const resultPromise = joinpoint.proceed()
        return resultPromise
          .then(advice)
          // Then next line prevents advice from changing the return value,
          // while still preserving the promise chain and surfacing errors.
          // Feel free to drop it if you *want* to be able to change the return value.
          .then(() => resultPromise)
    }
    return meld.around(target, method, applyAfterFulfilling)
}

Hope that helps!


how to do demultiplexing

hello,
I have 10 Split-seq datasets, some have 4 barcodes, the others have 5 barcodes. So I have 3 questions:
1:
--version merged which produces one .fastq file in which CellID and UMI information is appended to the readID.
--version split which produces one .fastq file for each single-cell identified. Output .fastq files are named using the identified barcode combination and UMIs are appended to the readID.
--version fast which produces one .fastq file in which CellID and UMI information is appended to the readID. The fast version utilizes position based barcode extraction and multithreading to deliver massively faster results compared to the original split and merged configurations.
how do I choose the correct version?
2:  Do I specify 4 or 5 barcodes when I run splitseqdemultiplex_0.2.1.sh?
-1 | --round1barcodes # specifies name of the file containing the barcodes you would like to use for round1. These should be provided as a separate file. See the provided example for formatting reference.
-2 | --round2barcodes # specifies name of the file containing the barcodes you would like to use for round2. These should be provided as a separate file. See the provided example for formatting reference.
-3 | --round3barcodes # specifies name of the file containing the barcodes you would like to use for round3. These should be provided as a separate file. See the provided example for formatting reference.
3: Does splitseqdemultiplex_0.2.1.sh generates the expression matrix?
Best,

Hi biohubx,
Thanks for your interest in our demultiplexing tool.  Our software was written to work with the originally published configuration of SPLiT-Seq (DOI: 10.1126/science.aam8999).  This original configuration contains only 3 SPLiT-Seq barcodes.  4 and 5 barcode configurations will not work with our current version.  However we would be happy to take a look at expanding our tool to support the additional barcodes.  The best way to achieve this would be for you to send me a small subset of your Forward and Reverse fastq files. (The first 5000 lines should be sufficient).  Please also let me know if there are any other departures from the published protocol as these may cause additional incompatibilities.  I hope this is helpful!

Paul

I just took a look at your original paper, and fond that you used 4 barcodes to prepare for the library.

So I am a little confused with your protocol.
2: Do I specify 4 or 5 barcodes when I run splitseqdemultiplex_0.2.1.sh?
-1 | --round1barcodes # specifies name of the file containing the barcodes you would like to use for round1. These should be provided as a separate file. See the provided example for formatting reference.
-2 | --round2barcodes # specifies name of the file containing the barcodes you would like to use for round2. These should be provided as a separate file. See the provided example for formatting reference.
-3 | --round3barcodes # specifies name of the file containing the barcodes you would like to use for round3. These should be provided as a separate file. See the provided example for formatting reference.
3: Does splitseqdemultiplex_0.2.1.sh generates the expression matrix?

Hi biohubx,
I think the confusion is that barcodes 1-3 are the "SPLiT-Seq" barcodes while barcode 4 "Is really an illumina index".
Before beginning demultiplexing with the SPLiT_Seq-Demultiplexing you need to run BCLtoFastq to demultiplex your separately barcoded illumina datasets.  This process will remove the "4th barcode (illumina index)".  You will be left with fastq files that have three split-seq barcodes (1-3) in the image you attached above.
Did you use the SPLiT-Seq published barcode sequence?  If so you don't need to alter the provided files.  If you used custom barcode sequences you can provide them as described here:  https://github.com/paulranum11/SPLiT-Seq_demultiplexing/issues/3

In response to "3:" yes splitseqdemultiplex_0.2.1.sh does generate the genes (rows) cells (columns) expression matrix.

thanks.  great.  your code will generate expression matrix.
I have another question:
--version merged which produces one .fastq file in which CellID and UMI information is appended to the readID.
--version split which produces one .fastq file for each single-cell identified. Output .fastq files are named using the identified barcode combination and UMIs are appended to the readID.
--version fast which produces one .fastq file in which CellID and UMI information is appended to the readID. The fast version utilizes position based barcode extraction and multithreading to deliver massively faster results compared to the original split and merged configurations.
how do I choose the correct version?

Would you like to explain the functions of these first 3 barcodes?

Hi biohubx,
I think the confusion is that barcodes 1-3 are the "SPLiT-Seq" barcodes while barcode 4 "Is really an illumina index".
Before beginning demultiplexing with the SPLiT_Seq-Demultiplexing you need to run BCLtoFastq to demultiplex your separately barcoded illumina datasets. This process will remove the "4th barcode (illumina index)". You will be left with fastq files that have three split-seq barcodes (1-3) in the image you attached above.
Did you use the SPLiT-Seq published barcode sequence? If so you don't need to alter the provided files. If you used custom barcode sequences you can provide them as described here: #3

I haven't obtained split-seq data. I am not sure whether they used the same barcodes as you did.

You said that you have 10 SPLiT-Seq barcoded datasets on hand.  If you did not generate them who did?  Ask this person what barcodes were used. Or read the paper associated with these datasets. It would be unusual for someone to use different barcode sequences but it is possible.
If you are unsure how many SPLiT-Seq barcodes are in your fastq files open the first 100 reads of your read2.fastq file with a text editor and look for similar and dissimilar sequences between the reads.  Each barcode will be visible as an 8bp variable sequence region.  There will also a be a UMI which will be a 10bp variable region (is this the 5th barcode you are referring to?)
You should use "--version fast" or "splitseqdemultiplex_0.2.2.sh" which is located in the "Python_only_tool" directory.

With each version of SPLiT-Seq-Demultiplexing there is a small example dataset.  I suggest you start by working with this small example to confirm that you can get the software running.  Once that is working you should compare it to your dataset. If the construction of your dataset is similar to the small example then you can proceed to running your dataset.


Send push receipts in response on feed post creation

Not getting pushes again, and no way to troubleshoot why after push receipts were removed. Please put them back in

Still not working. Here are logs from chattahooligan-dev
 2020-02-29T15:26:04.546368+00:00 app[web.1]: CHECKING FOR PUSH  2020-02-29T15:26:04.546436+00:00 app[web.1]: PUSH TRUE  2020-02-29T15:26:04.546522+00:00 app[web.1]: sending push...  2020-02-29T15:26:04.546649+00:00 app[web.1]: ABOUT TO RETURN  2020-02-29T15:26:04.559233+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[NQjQBqBjcnAfQk8N-3R2al]  2020-02-29T15:26:04.559309+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[HcDpdlINasiVlvc8fOIlEa]  2020-02-29T15:26:04.559371+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[rA-sHTCBP85w2U3D9kix17]  2020-02-29T15:26:04.559430+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[r76-uHJwwHZM8y5OwgXNOW]  2020-02-29T15:26:04.559510+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[I8QML2Ir_01kPeOXEfjizU]  2020-02-29T15:26:04.559567+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[jqoXnuCi8Acw2sk9Dtq_C2]  2020-02-29T15:26:04.559624+00:00 app[web.1]: trying to push  2020-02-29T15:26:04.560414+00:00 app[web.1]: [0mPOST /api/feed [32m200 [0m31.997 ms - 392[0m  2020-02-29T15:26:04.709011+00:00 app[web.1]: there was a problem with the push  2020-02-29T15:26:04.709157+00:00 app[web.1]: Error notifying with tokens [ExponentPushToken[NQjQBqBjcnAfQk8N-3R2al], ExponentPushToken[HcDpdlINasiVlvc8fOIlEa], ExponentPushToken[rA-sHTCBP85w2U3D9kix17], ExponentPushToken[r76-uHJwwHZM8y5OwgXNOW], ExponentPushToken[I8QML2Ir_01kPeOXEfjizU], ExponentPushToken[jqoXnuCi8Acw2sk9Dtq_C2]]: Error: All push notification messages in the same request must be for the same project; check the details field to investigate conflicting tokens.  2020-02-29T15:26:04.710447+00:00 app[web.1]: (node:21) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client  2020-02-29T15:26:04.710447+00:00 app[web.1]:     at ServerResponse.setHeader (_http_outgoing.js:470:11)  2020-02-29T15:26:04.710448+00:00 app[web.1]:     at ServerResponse.header (/app/node_modules/express/lib/response.js:771:10)  2020-02-29T15:26:04.710449+00:00 app[web.1]:     at ServerResponse.send (/app/node_modules/express/lib/response.js:170:12)  2020-02-29T15:26:04.710449+00:00 app[web.1]:     at ServerResponse.json (/app/node_modules/express/lib/response.js:267:15)  2020-02-29T15:26:04.710449+00:00 app[web.1]:     at ServerResponse.send (/app/node_modules/express/lib/response.js:158:21)  2020-02-29T15:26:04.710450+00:00 app[web.1]:     at PushTokens.find (/app/models/pushHandler.js:89:7)  2020-02-29T15:26:04.710450+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:68:7)  2020-02-29T15:26:04.710527+00:00 app[web.1]: (node:21) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3)  2020-02-29T15:26:04.559831+00:00 heroku[router]: at=info method=POST path="/api/feed" host=chattahooligan-dev.herokuapp.com request_id=5a3305ba-0240-4c9c-8f43-819f7e849bc0 fwd="<IP_ADDRESS>" dyno=web.1 connect=0ms service=46ms status=200 bytes=826 protocol=https

expanding error.details on chattahooligan-dev yields
{"@chattahooligan/chattahooligan-hymnal":["ExponentPushToken[NQjQBqBjcnAfQk8N-3R2al]","ExponentPushToken[HcDpdlINasiVlvc8fOIlEa]","ExponentPushToken[I8QML2Ir_01kPeOXEfjizU]","ExponentPushToken[jqoXnuCi8Acw2sk9Dtq_C2]"],"@ngsdetroit/chattahooligan-hymnal":["ExponentPushToken[rA-sHTCBP85w2U3D9kix17]","ExponentPushToken[r76-uHJwwHZM8y5OwgXNOW]"]}
Good candidates for deletion. Maybe we store the acceptable expo experience in an environment variable and not accept registration of tokens that don't match, and purge them as well

for some reason, response.data is valid inside feedService.createPost but not returning sucessfully. Shows as undefined after the function exits

Deleting those would help for sure. Regarding your broken return issue: this may be why:
UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Maybe multiple attempts to send data or set the error code are doing this. I'd look into that error to be sure, but I'd bet you it's the root.

that error is triggered by
res.send({ errors: errors, receipts: receipts });

feedController .store appears to return before pushHandler completes
maybe this should be in an ELSE block, if .push is not true?
return res.json(feedItem);
and/or maybe pushHandler doesn't need to be calling res.send() in the first place, but instead return something that's used in the calling block in the first place
logs:
2020-03-03T02:28:14.286748+00:00 app[web.1]: CHECKING FOR PUSH
2020-03-03T02:28:14.286931+00:00 app[web.1]: PUSH TRUE
2020-03-03T02:28:14.287669+00:00 app[web.1]: sending push...
2020-03-03T02:28:14.288144+00:00 app[web.1]: ABOUT TO RETURN
2020-03-03T02:28:14.296528+00:00 app[web.1]: trying to send notification to token:  ExponentPushToken[NQjQBqBjcnAfQk8N-3R2al]
...and so on

i could misunderstand how Promises work, but something is def fishy with how the logs come out vs when the code is executed.
Maybe async/await for pushHandler will do the job?

Honestly, it should be the latter, and res shouldn't be passed in- but I struggled to get async/await to work when I tried doing it, and obviously I failed to do it via promises as well. Collin or you might be able to fix it in short order.

Lmk when you are able to code again. I don't have the capacity to learn how all of the server code works from scratch and also not be 2 months behind on starting Prideraiser. At least we have a hint on what's happening and how to fix it

Latest error
2020-03-10T16:38:15.695039+00:00 app[web.1]: There was an error sending a notification: {"id":"01daeac4-3a18-4336-857d-25e1d0b9a505","status":"error","message":"The recipient device is not registered with FCM.","details":{"error":"DeviceNotRegistered","fault":"developer"}} 2020-03-10T16:38:15.695163+00:00 app[web.1]: Receipt cleanup error:  TypeError: Cannot read property 'length' of null

This error comes from pushHandler.js line 141. It's probably referring to the regex check returning null instead of an empty array, but that's just a guess.
What's interesting is that these "device not registered with FCM" error types is that there's no pushtoken in the message that we can subsequently go delete. I'm not sure how to handle them?
Maybe the receipt ID can be used as a lookup (to what?) to determine the problem tokens

Maybe we can make an array for every token in a particular chunk, look at every receipt (i think the valid tokens can be found in succesful receipts), and flag those that were good and delete everything else?

The last I recall, the server is not returning a list of tokens. It should for debugging purposes. Recall that Chattahooligan Hymnal has a current issue with push notifications.


⚠ GitLab Server has degraded performance

In 2603721, GitLab Server (https://gitlab01.its-telekom.eu) experienced degraded performance:

HTTP code: 200
Response time: 11497 ms

Resolved: GitLab Server performance has improved in c01ac46.


size is not working

size is not working

good morning~999

Did you solved this issue?

+1

+1

+1

+1

+1

Fixed the README. font size is not supported by Android's Html class.
I am open for pull requests to implement font size...


How to solve WSL2 error 0x803b0017?

Windows Version
Microsoft Windows [Version 10.0.19045.2965]
WSL Version
<IP_ADDRESS>
Are you using WSL 1 or WSL 2?

[x] WSL 2
[ ] WSL 1

Kernel Version
<IP_ADDRESS>
Distro Version
Ubuntu 20.04
Other Software
No response
Repro Steps

Enable "Virtualization Technology" in BIOS.
Run the following commands on CMD.exe as admin:> wsl --set-default-version 2
> wsl --install

Then, wsl2 installs latest Ubunts and starts.
Exit Ubunts with exit command.
Exit CMD.exe with exit command.
Start CMD.exe again.
Run wsl command and get the following error:低下状態のオブジェクトに対する操作の試みがありました。
Error code: Wsl/Service/CreateInstance/CreateVm/ConfigureNetworking/0x803b0017

Expected Behavior
Ability to access my WSL2.
Actual Behavior

Diagnostic Logs
No response

/logs

The attachment is logs output by collect-wsl-logs.ps1.
WslLogs-2023-06-02_16-56-15.zip

@m-takahashi-lattice: I'm not seeing any WSL logs in the zip file you shared. Can you run the log collection while you reproduce the issue and share logs again ?
/logs


rename "remotes" to "IaaS Providers"

"Supported remotes" makes me think it's about the terraform state remote storage or something, and not about all the supported resources in this IaaS.

Q
A

🐛 Bug fix?
no

🚀 New feature?
no

⚠ Deprecations?
no

❌ BC Break
no

🔗 Related issues
#...

❓ Documentation
yes

Description
Rename for clarity

A provider like Github is not really an IaaS provider, we should found a more generic naming IMHO.

A provider like Github is not really an IaaS provider, we should found a more generic naming IMHO.

A provider like Github is not really an IaaS provider, we should found a more generic naming IMHO.

I agree with this statement. We need to think like Terraform about that kind of naming.

A provider like Github is not really an IaaS provider, we should found a more generic naming IMHO.

I agree with this statement. We need to think like Terraform about that kind of naming.

@sjourdan Can you open a discussion for this topic ? I'm closing this PR.

@sjourdan Can you open a discussion for this topic ? I'm closing this PR.


[Microsoft.ApiManagement][2019-12-01] Content management resources: Collapsed the reference to metadata.

MSFT employees can try out our new experience at OpenAPI Hub  - one location for using our validation tools and finding your workflow.

Contribution checklist:

[x] I commit to follow the Breaking Change Policy of “no breaking changes
[x] I have reviewed the documentation for the workflow.
[x] Validation tools were run on swagger spec(s) and errors have all been fixed in this PR. How to fix?

If any further question about AME onboarding or validation tools, please view the FAQ.
ARM API Review Checklist

[ ] Ensure to check this box if one of the following scenarios meet updates in the PR, so that label “WaitForARMFeedback” will be added automatically to involve ARM API Review. Failure to comply may result in delays for manifest application. Note this does not apply to data plane APIs, all “removals” and “adding a new property” no more require ARM API review.

Adding new API(s)
Adding a new API version
Adding a new service

[x] If you are blocked on ARM review and want to get the PR merged with urgency, please get the ARM oncall for reviews (RP Manifest Approvers team under Azure Resource Manager service) from IcM and reach out to them.

Breaking Change Review Checklist
If there are following updates in the PR, ensure to request an approval from API Review Board as defined in the Breaking Change Policy.

[ ] Removing API(s) in stable version
[ ] Removing properties in stable version
[ ] Removing API version(s) in stable version
[ ] Updating API in stable version with Breaking Change Validation errors
[ ] Updating API(s) in preview over 1 year

Please follow the link to find more details on PR review process.

/azp run automation - sdk

azure-resource-manager-schemas
❌ failed [Logs] [Expand Details]

Just to make it clear, there are no breaking changes since we're updating an example payload.

@azaslonov Can you please check if you can fix the CI failure? Thanks.

@azaslonov Can you please check if you can fix the CI failure? Thanks.

I cannot fix this, as I mentioned this is not a breaking change, because I'm changing the payload example (not actual API). Plus that I'm doing this because of another bug related to SDK generation validation tools<EMAIL_ADDRESS>for details).


EntityService Feature

EntityService Feature
We're working on a new service that will simplify the work with REST APIs in Angular and will perform most of the work for you. For example, let's say that you have a Todo entity in the server. The standard CRUD API for this will be:
GET => baseUrl/todos

GET => baseUrl/todos/id

POST => baseUrl/todos

UPDATE => baseUrl/todos/id

REMOVE => baseUrl/todos/id

So, to simplify the work with these APIs, we'll introduce the HttpClientEntityService class. This is how it works:
@Injectable({ providedIn: 'root' })
@EntityServiceConfig({ ... })
export class TodosService extends HttpClientEntityService<TodosState> {
  constructor(protected store: TodosStore) {
    super(store);
  }
}

// app.module
@NgModule({
  ...
  providers: [
    { provide: HTTP_CLIENT_ENTITY_SERVICE_CONFIG, useValue: {
        baseUrl: 'https://jsonplaceholder.typicode.com'
    }}
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

The HttpClientEntityService will expose all the GET and CRUD methods you need, so you can easily use it from the component:
export class TodosPageComponent {
  posts$ = this.todosQuery.selectAll();
  loading$ = this.todosQuery.selectLoading();

  constructor(
    private todosQuery: TodosQuery,
    private todosService: TodosService
  ) {}

  ngOnInit() {
    this.todosService.get().subscribe();
  }

  fetchOne() {
    this.todosService.get(id).subscribe(console.log);
  }

  add() {
    this.todosService.add(entity).subscribe({
      error() { // show error }
    });
  }

  update() {
    this.todosService.add(id, entity).subscribe();
  }

  remove() {
    this.todosService.delete(1).subscribe();
  }
}

Each method also takes a config object where you could pass custom headers, params, etc. In addition to that, we'll create a dispatcher that you can inject and listens for any action you want:
export class MyComponent {

  constructor(
    private dispatcher: EntityServiceDispatcher
  ) {}

  ngOnInit() {
    this.dispatcher.action$
      .pipe(
        ofType('success'),
        filterMethod('DELETE')
      )
      .subscribe(action => {
          action = { method: "DELETE"
                     payload: {}
                     storeName: "todos"
                     type: "success"
                   }
      });
  }
 }

This feature is work in progress. We would love to hear your feedback and ideas.

Akita wise this is indeed a good suggestion - most of the users are indeed implementing it on their own already I assume.
In our specific case, the server base URL is only available after user logs in due to the fact that it not always has a static host (cyber security system).
I think that adding the ability to to configure the base in run time could be helpful for others as well.
Also, our BE accepts most of the UD operations in POST for different reasons - so having defaults for HTTP methods would be nice to not specify them explicitly each time.
But that's only us :)

Good Idea, but this will be in relation with Akita store ?
Can this service will be linked easily and quickly to a store, so that the store's actions are saved directly in the api, at the same time as in the store. Because often in some cases, we do not need to do more. So with this service connected to the blind, this would limit the boilerplate code.

Sure, it will update the store.

Hi @NetanelBasal! There is no post() method in NgEntityService. For example if I want to verify an email, I need to inject the HttpClient and call the post() method separately:
@NgEntityServiceConfig()
@Injectable({providedIn: 'root'})
export class UserService extends NgEntityService<UserState> {
  constructor(protected store: UserStore, private _http: HttpClient) {
    super(store);
  }

  load() {
    cacheable(this.store, super.get()).subscribe();
  }

  checkEmail$(user: Partial<User>) {
    return this._http.post<string[]>(`${environment.api}/users/validate`, user);
  }
}

It would be great if I could perform the post() method using NgEntityService like this (same class, checkEmail$ method is changed):
checkEmail$(user: Partial<User>) {
  return super.post<string[]>('', user, {
    resourceName: 'users/validate', // with this attribute I could change the API endpoint
  });
}

Is this possible to implement?
Thank you in advance!

@vladimirdrayling, the goal of this service is entities management. I can expose the HTTP provider so you wouldn't need to inject it:
checkEmail$(user: Partial<User>) {
  return this.http.post<string[]>('', user, {
    resourceName: 'users/validate', // with this attribute I could change the API endpoint
  });
}

@NetanelBasal thank you for speedy response! That would be great!


Made the navbar look better when scrolling

Before:

After:

We believe that this was a conscious design decision


Development

Hi @zenott ,
Good job 👏 . UI is so nice and simple. I liked that current location feature. This project successfully met all the requirements. I can search for the weather by a city name. I can change Celcius to Fahrenheit. I can see the weather forecast. This is from me 👍 . You can merge it into the master.
Thanks 🙏


White Glove feature enablement

When can we expect White Glove to move from private to preview ? Just tried it and got red screen. Event log says "White Glove not supported". Is it part of 1905 Service Release ? Thanks in advance.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: ca5b57d1-61b3-39d4-34ff-d6dcb858c250
Version Independent ID: 42609104-815f-9e7a-39aa-38d92cc910c9
Content: Windows Autopilot for white glove deployment
Content Source: windows/deployment/windows-autopilot/white-glove.md
Product: w10
Technology: windows
GitHub Login: @greg-lindsay
Microsoft Alias: greg-lindsay

@officedocsbot assign @e0i

@officedocsbot assign @e0i

Hello, @jmrita  thank you for providing feedback.
The issues section of this repository is intended for product documentation issues only.
Please consider opening a product support ticket by the following link below for your question so that it gets answered quickly.
Windows 10 Support
Thank you.

Insert a USB key, click the “View diagnostics” button, and specify the USB as the location – the files will be generated in the background on that location, so don’t remove the USB key too quickly.  Then view the files on the USB to troubleshoot.

Hello @jmrita  ,
We are closing this issue since your question seems to be answered.
Thanks.

@officedocsbot close


Firebase Database on orderByChild / orderByKey returns in random order

firebase_database: 1.0.2
Steps to Reproduce
Run a simple Flutter app:
https://gist.github.com/dotdoom/5180eb27084afb3b71db44f2201c6877
Most important part is (for history purposes):
(await FirebaseDatabase.instance
            .reference()
            .child(subpath)
            .orderByChild('year')
            .limitToFirst(3)
            .onValue
            .first)
        .snapshot
        .value
        .values
        .forEach((v) => debugPrint(v['year'].toString()));

The output is indeed the first 3 entries of a sorted list, but the entries themselves are not sorted:
I/flutter ( 6096): Sorted years:
I/flutter ( 6096): 1856
I/flutter ( 6096): 1867
I/flutter ( 6096): 1564

limitToFirst does not affect the order and is only to demonstrate that Firebase server gets the correct request.
I suspect there might be some issue when transferring data between Java and Dart where the map ordering is lost. Unfortunately it's buried too deep for me to find quickly, so I hope someone with more experience in the MethodChannel mechanism can help me out. The type of the map in Flutter app is _InternalLinkedHashMap which IIUC is supposed to be ordered.
Logs
[✓] Flutter (Channel beta, v0.5.1, on Linux, locale en_US.UTF-8)
    • Flutter version 0.5.1 at /home/artem/pkg/flutter
    • Framework revision c7ea3ca377 (7 weeks ago), 2018-05-29 21:07:33 +0200
    • Engine revision 1ed25ca7b7
    • Dart version 2.0.0-dev.58.0.flutter-f981f09760

[✓] Android toolchain - develop for Android devices (Android SDK 27.0.0)
    • Android SDK at /home/artem/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-27, build-tools 27.0.0
    • Java binary at: /home/artem/pkg/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)
    • All Android licenses accepted.

[✓] Android Studio (version 3.1)
    • Android Studio at /home/artem/pkg/android-studio
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)

[!] VS Code (version 1.25.1)
    • VS Code at /usr/share/code
    • Flutter extension not installed; install from
      https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected devices (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.1.0 (API 27) (emulator)

! Doctor found issues in 1 category.

I think it will be ok to re-open the issue basing on https://github.com/flutter/flutter/issues/19389#issuecomment-506513807.

I have this problem still. Trying order and not working.

tl;dr: this is WAI, see #711.
The fact is that Flutter's DataSnapshot.value is supposed to be an API equivalent of Android DataSnapshot.getValue, which "returns the data contained in this snapshot as native types" (emphasis mine).
Now the problem is that "native type" for Map in Java is HashMap, which is unordered. So this is WAI because Flutter team is making efforts to mirror native API as closely as possible.
To solve the problem of ordering, Flutter plugin has to provide an API to iterate over children in order (much like in Java one would do with DataSnapshot.getChildren). This is being requested in #711.

Having the same problem, is there any way to fix this?

not yet

I am experiencing this problem as well. Still no fix?

Still experiencing the same issue

Hit by this issue today :(

For those having the problem, the fastest workaround for now is to get the keys of the queried documents, call sort() on the keys and and do your loop with those sorted keys. This is possible because database keys are generated time wise, so sorting them actually sorts them from oldest to newest.

It sounds like this issue should be reopened in that case: https://github.com/FirebaseExtended/flutterfire/issues/711

having this issue too

Until this issue is fixed, you can get the keys in correct order by listening to the onChild... streams.
So:
(await FirebaseDatabase.instance
            .reference()
            .child(subpath)
            .orderByChild('year')
            .limitToFirst(3)
            .onValue
            .first)
        .onChildAdded
        .listen((Event event) {
          print(event.snapshot.value['year']);
        })

There is a great utility class called FirebaseList included in the package that makes this much easier:
list = FirebaseList(query: query,
  onChildAdded: (pos, snapshot) {},
  onChildRemoved: (pos, snapshot) {},
  onChildChanged: (pos, snapshot) {},
  onChildMoved: (oldpos, newpos, snapshot) {},
  onValue: (snapshot) {
    for (var i=0; i < this.list.length; i++) {
      print('$i: ${list[i].value['year']}');
    }
  }
);

In the onValue here you can access this.list as an array and the child nodes from query are present in the correct order in.
Also see my answers to questions about this topic on Stack Overflow:

https://stackoverflow.com/questions/51808719/flutter-firebase-database-wrong-timestamp-order/51811808#51811808
https://stackoverflow.com/questions/61333194/flutter-firebase-real-time-database-orderbychild-has-no-impact-on-query-result/61333575#61333575

@puf thanks for posting a workaround.
cc @russellwheatley @rrousselGit I know Database isn't one of the plugins in our purview at the moment but supporting forEach looks like something that could have a lot of positive impact here; so we could try look at adding it in ourselves and model it after our implementation in React Native Firebase. Let's discuss feasibility internally.


type a letter on the date field and it crashes

need to check that the input is a valid date before assigning the value to the time variable on the link function of the directive:
something like this.
                        newTime = new Date(newTime);

                        if (isNaN(newTime.getTime()) == false) {
                            scope.time = newTime; // change the time
                            if (firstTimeAssign) {
                                firstTimeAssign = false;
                            }
                        }

Pull request?

Related commit: https://github.com/zhaber/angular-js-bootstrap-datetimepicker/commit/0b573c2255e69818c736bdd3b44aa6126073eb6d


| {"log.level":"debug","@timestamp":"2022-05-22T19:52:41.832Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:42.260Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:42.260Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:42.301Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:42.301Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:42.442Z","log":{"logger":"elastic-apm-node"},"event.module":"apmclient","apmServerVersion":"7.17.0","ecs":{"version":"1.6.0"},"message":"fetched APM Server version"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.679Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.679Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.725Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.725Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.726Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.726Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.727Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.727Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.727Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.727Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.728Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.728Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.729Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.729Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.729Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.729Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.730Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.730Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.731Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"no active transaction found - cannot build new span"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.731Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"intercepted call to https.request {\"id\":null}"}                                                                                |
| {"log.level":"trace","@timestamp":"2022-05-22T19:52:43.798Z","log":{"logger":"elastic-apm-node"},"awsRequestId":"2b561e98-22c1-4359-8492-ab8bbb43565c","ecs":{"version":"1.6.0"},"message":"lambda: fn end"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.799Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"setting transaction result {\"trans\":\"aa8810e79d9719fc\",\"trace\":\"ab4bc9db63076fb13bee47075c725281\",\"result\":\"HTTP 2xx\"}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.799Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"ignoring transaction {\"trans\":\"aa8810e79d9719fc\",\"trace\":\"ab4bc9db63076fb13bee47075c725281\"}"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.800Z","log":{"logger":"elastic-apm-node"},"trans":"aa8810e79d9719fc","name":"GET /dev/xfunc","trace":"ab4bc9db63076fb13bee47075c725281","type":"request","result":"HTTP 2xx","duration":2388.415,"ecs":{"version":"1.6.0"},"message":"ended transaction"}                                                                                |
| {"log.level":"warn","@timestamp":"2022-05-22T19:52:43.800Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"error":{"type":"Error","message":"cannot flush agent before it is started","stack_trace":"Error: cannot flush agent before it is started\n    at B._flush (/var/task/src/functions/xfunc/handler.js:306:34473)\n    at Q (/var/task/src/functions/xfunc/handler.js:317:75585)\n    at /var/task/src/functions/xfunc/handler.js:317:75837"},"message":"cannot flush agent before it is started"}                                                                                |
| {"log.level":"trace","@timestamp":"2022-05-22T19:52:43.800Z","log":{"logger":"elastic-apm-node"},"awsRequestId":"2b561e98-22c1-4359-8492-ab8bbb43565c","ecs":{"version":"1.6.0"},"message":"lambda: wrapper end"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"apm-lambda-extension/main.go","file.line":175},"message":"Received log event platform.runtimeDone","ecs.version":"1.6.0"}                                                                                |
| {"log.level":"info","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"apm-lambda-extension/main.go","file.line":180},"message":"Received runtimeDone event for this function invocation","ecs.version":"1.6.0"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"apm-lambda-extension/main.go","file.line":203},"message":"Received runtimeDone signal","ecs.version":"1.6.0"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"apm-lambda-extension/main.go","file.line":155},"message":"Received signal that function has completed, not processing any more agent data","ecs.version":"1.6.0"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"extension/process_events.go","file.line":39},"message":"Flush started - Checking for agent data","ecs.version":"1.6.0"}                                                                                |
| {"log.level":"debug","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"extension/process_events.go","file.line":48},"message":"Flush ended - No agent data on buffer","ecs.version":"1.6.0"}                                                                                |
| {"log.level":"info","@timestamp":"2022-05-22T19:52:43.828Z","log.origin":{"file.name":"apm-lambda-extension/main.go","file.line":113},"message":"Waiting for next event...","ecs.version":"1.6.0"}                                                                                |

Am I trying to wrap at the wrong point or what could be wrong this time?

Thank you.
Due to little time, I was only able to briefly test things again on this topic. One note, the could not shim handler module: ENOENT: no such file or directory, open '/var/task/src/functions/xfunc/package.json' still appears, I just didn't include these lines, sorry.
Here are my answers to the other points:

aborted start messages are not present
I don't configure any custom transport value
I can share an example setup to reproduce, but I'm not sure whether I'll get to that this week or next

Thanks for the support, I'll post more once I get to it.

I reduced down the problematic handler to very little with still getting the same log output (cannot flush agent before it is started). I then used you handler example from elastic/apm-agent-nodejs/issues/2709 ... and the error is still the same. So it cannot be due to the handler 😓  Lambda-api or middy is not involved anymore.
Handler file now looks like this:
import { AwsFunction } from "@libs/serverless/handlerResolver";
import { APIGatewayEvent, Context } from "aws-lambda";
import { APIGatewayProxyResult } from "aws-lambda/trigger/api-gateway-proxy";
import agent from 'elastic-apm-node';
import lambda_api from "lambda-api";

export const xFunction: AwsFunction = {
  handler: `src/functions/xfunc/handler.main`,
  timeout: 30,
  events: [
    {
      http: {
        method: "ANY",
        path: "xfunc",
        cors: true,
        private: true,
      },
    },
  ],
};

export const main = agent.lambda(function main (_event, _context, _callback) {
  return new Promise(function(resolve, _reject){
        const response = {
            statusCode: 200,
            headers: {"content-type": "application/json"},
            body: JSON.stringify({hello:'world'})
        };
        resolve(response)
  })
})

Thank you for pulling those two packages out of the equation.
We'd like to see if we can reproduce the exact problem you're having.  If we can reproduce it, we can advise you on a fix or find the underlying bug that's causing the problem.

I see you program -- this looks like typescript, not javascript.  Would you be able to share the compiled javascript that's produced and deployed to your Lambda function?

Can you confirm that this program is located in the file src/functions/xfunc/handler.js in your lambda function? If not, where is this file located?

Can you confirm that your handler value in the AWS Lambda console is set to src/functions/xfunc/handler.main?  If not, what is it set to?

There is a v3.35.0 release of the agent with Alan's fix for https://github.com/elastic/apm-agent-nodejs/issues/2709
The table of new ARNs is here: https://github.com/elastic/apm-agent-nodejs/releases/tag/v3.35.0
Updating to that layer should fix at least the handler being in a subpath.

Updating to that layer should fix at least the handler being in a subpath.

Though I have hit another error when trying to reproduce:
{
    "errorType": "TypeError",
    "errorMessage": "Cannot set property main of #<Object> which has only a getter",
    "trace": [
        "TypeError: Cannot set property main of #<Object> which has only a getter",
        "    at wrapNestedPath (/opt/nodejs/node_modules/elastic-apm-node/lib/lambda.js:512:20)",
        "    at module.exports (/opt/nodejs/node_modules/elastic-apm-node/lib/instrumentation/modules/_lambda-handler.js:11:3)",
        ...

so we'll need to look into that as well.

Sorry for going silent here, I was busy last week.
I can report that using v3.35.0 solves my problems and I can see the data coming in without any problems. I don't event need to wrap the handler or anything like that. 🎉

layers:
- arn:aws:lambda:sa-east-1:267093732750:layer:elastic-apm-extension-ver-1-0-2-x86_64:1
- arn:aws:lambda:sa-east-1:267093732750:layer:elastic-apm-node-ver-3-35-0:1
Should solves!


Replace Export Client/Distro with App-Service-Configurable as default in docker files for Fuji

App-Service-Configurable (rules-engine profile) will be the default in docker files for Fuji for messages passed to the Rules Engine.
Export Client/Distro need to be commented out so user can easily switch back if they prefer to use them. Also comment that they will need to change Rules Engine setting to use Export Client/Distro.
This change is dependent on config-seed PR https://github.com/edgexfoundry/edgex-go/issues/1991 being merged and new docker image available on Nexus.

This is a duplicate of #168 . Forgot I had already created this one. :-(


Create the factory for impulse models + unittest code

It requires to create the differential action factory #621

done


Storage folder with read only access

I'm running a Microk8s cluster with two nodes running Ubuntu 20.04.3 LTS.
On the cluster I have enabled local storage using microk8s.enable storage.
Everything seem to work well except all the pods that try to use storage on node1 have access permissions problems.
what I realized is that when the directory are crested on /var/snap/microk8s/common/default-storage/ on node1 they have different permissions then on node 2 .
for example Node 1:
 drwxr-xr-x 2 root root 4096 Nov  9 12:06 default-data-rabbitmq-0-pvc-5a75436c-1e41-43eb-80d5-358c0771a77c
Node 2:
drwxrwxrwx 2 root root 4096 Nov  9 09:56 default-data-rabbitmq-0-pvc-5a75436c-1e41-43eb-80d5-358c0771a77c
So the pod on Node 1 fails because of access rights, and only starts when I go to node 1 and manually do:
sudo chmod +777 /var/snap/microk8s/common/default-storage/default-data-rabbitmq-0-pvc-5a75436c-1e41-43eb-80d5-358c0771a77c
this happens every single time node1 get assigned a pod that needs a volume.
Any ideas?
inspection-report-20211109_123605.tar.gz
.

Hi @cfonseca-elsevier i am going to guess, the hostpath-provisoner is running on node2.
The chmod 777 done by the provisioner only works where the provisioner is running.
Hostpath is only usable for single nodes.  If you want the pods to access the local storage, i normally use this https://github.com/rancher/local-path-provisioner
Or use OpenEBS addon and use its local path provisioner.

Hello Balchua.  Yes that is my guess also.  there should be a big caveat on using local storage as it is on multi node, and for sure not to use it when the cluster is using different architectures in the nodes... i have a mix of arm and x86_64, and the pod used for  hostpath-provisoner used a container based of the node where we enable the storage, so after a restart for example local storage stopped working because it tried to start an arm pod in an xb86_84 node...
Thanks for the link I will give it a go.

I have the same issue. Reproduce steps here: https://gist.github.com/doggy8088/ce56e10152accee429425a36ef0ac909
The storage class creating a PVC and create PV on each nodes. The hostPath folder only apply 777 permission on microk8s-vm (master node).  All worker nodes are 755 permission, so that the Redis cause Can't open the append-only file: Permission denied and unable to started correctly.
Is it a bug on storage add-on?


Highlighted active line could be shown even when editing quotes

When editing a quote (> …) with the "Highlight active line" option on, the active line is not highlighted as usual (there is no highlight mark on the left side). It would be nice to keep the highlight even in this case.

When will this feature be released？


feat: Added keyboard navigation to Compose Actions Menu

Details

Added keyboard navigation and keyboard based menu trigger for Compose Actions Menu
Updated changes consists of using ArrowKeyFocusManager and KeyboardShortcuts lib for keyboard handling.

Fixed Issues

$ https://github.com/Expensify/App/issues/7317
Tests

Tested keyboard navigation with arrow keys
Tested each menu trigger by clicking enter
Checked the focus border blue color shows for active menu

[x] Verify that no errors appear in the JS console

QA Steps
Web and Desktop

With the cursor in compose box Type Shift+Tab to navigate to ➕
Click on the ➕ icon to open the compose menu
With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
On selecting a particular menu item and pressing Enter key it should open the respective menu.
a. Request Money, it should Request Money RHS
b. Send Money, should open Send Money RHS
c. Add attachment, should open File Picker
Escape should hide the Popover

Mobile Web, iOS and Android App

Keyboard shortcuts won't work here, so we click the FAB (➕) button
For this we just need to check that clicking each menu item should open its respective menu
No crashes or exceptions on these items.
Tapping outside the popover should close it.

[x] Verify that no errors appear in the JS console

PR Review Checklist

Contributor (PR Author) Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] iOS / native
[x] Android / native
[x] iOS / Safari
[x] Android / Chrome
[x] MacOS / Chrome
[x] MacOS / Desktop

[x] I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
[x] I followed proper code patterns (see Reviewing the code)

[x] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
[x] I verified that comments were added to code that is not self explanatory
[x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[x] I verified any copy / text shown in the product was added in all src/languages/* files
[x] I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team on the original GH to get the correct copy.
[x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] Any functional components have the displayName property
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
[x] Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
[x] All JSX used for rendering exists in the render method
[x] The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[x] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[x] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[x] I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots

Web

https://user-images.githubusercontent.com/3069065/186272807-403940e8-bc8c-4b92-9d13-f5c41f51ae0c.mp4
Mobile Web

https://user-images.githubusercontent.com/3069065/186273977-21714e30-253a-49d5-929e-82d5b79b0540.mp4
Desktop

https://user-images.githubusercontent.com/3069065/186272851-35d169a4-c600-491d-a943-8ab43bcd1707.mp4
iOS

https://user-images.githubusercontent.com/3069065/186274361-1fe2dded-c530-46c7-bac7-536a118fe004.mp4
Android

https://user-images.githubusercontent.com/3069065/186273654-6656e9b6-2155-47b4-b229-281557d7c504.mp4

@parasharrajat @puneetlath PR Raised.
Questions:

The QA steps in the linked issue says "Cmd+Tab", I am guessing they mean "Shift+Tab" and not Command.
I've kept the border radius on focus as 0 for the blue border.
For a single menu item, it doesn't do anything, just shows a blue border

Tab focus has this UI

Hmm. I checked Arrow keys, not Tab. So should we also change activeMenuIndex based on Tab movement?

Tab movement automatically works. You just need to adjust the Border UI>

Shift+tab.
Tab.
Arrow keys

All should focus on the item. Which it does but UI needs to be adjusted. @mananjadhav could you please record a video for all in the above list. So that we can assess UI. cc: @Expensify/design

You just need to adjust the Border UI

Done

Tab movement automatically works.

It works but is not in sync with Arrow keys. If I am at the second menu item,  pressing the Tab should take me to the third menu item, it doesn't. What I'll have to do is update activeMenuIndex with Tab and Shift+Tab as well. Here's the video of the problem.
https://user-images.githubusercontent.com/3069065/154851976-bb20d811-b862-4eb0-bbd2-f60f9757c0a5.mp4

Yeah, That as well. Thanks for bringing this up. You can use the OnFocus event. That should suffice.

It looks like tabbing between menu items causes the items to slightly jump around. Could you please take a look at that? Perhaps it's due to the outline style that's being applied, but it looks like we're getting small 1-2px movements. I think the menu should stay perfectly in place and not move around, and you should only see outline styles being applied to the focused item.

I agree with @shawnborton 's comment. This is happening as the not-focused item does not have any border but focused has which takes 1px on each edge.
To fix this, I think we should use a transparent border for not-focused state so it does not cause a layout shift.

cc: @mananjadhav :arrow_up:

@mananjadhav  Do you think we can reuse code from https://github.com/Expensify/App/pull/7702? I was hoping to create a generic utility to manage arrow navigation as this is common to a few components but It seems Rory already created it in the linked PR. We can reuse that in this PR. Let's hold it till that PR is merged.

Was reviewing. Yeah looks like we can reuse. Lets wait for it to get merged.

Please as HOLD in the title for clear indication.

Ok. It seems 7702 is put on hold. At this stage, it would be best to proceed without those changes. later when that PR is merged these changes could be refactored as well.
@mananjadhav you are good to move ahead with the requested changes.

What is the state of this PR? 🤔 kind off got lost 😄 is it ready for a review now? If yes, we should probably merge main first.

So sorry @mountiny. I had to extend the leave and I’ve resumed this week. I am closing all my issues one by one and this will also get closed by the end of this week.

@mananjadhav no worries, Manan, it is important to take the time we need sometimes. Thanks for the update and take it step by step, dont overwork yourself now 😅

@roryabraham We did put this PR on hold for ArrowKeyFocusManager #7702 , but I guess it was going to take longer and we thought we'll close this first.  Do you think it'll get merged soon, if yes then it definitely makes sense.

@roryabraham the other PR is still open. Should we hold this for ArrowKeyFocusManager change to be available?

Yes, sorry for the delay and thanks for your patience. Let's wait for https://github.com/Expensify/App/pull/7702 to be ready before continuing with this please.

Let's take this off hold.

@mananjadhav feel free to explicitly re-request reviews once this is ready

I can see that the other places we're not syncing the Tab focus and the Arrow focuses, hence I've removed that part of the code and updated the PR. It now uses ArrowKeyFocusManager.

Sorry for the format, I've asked about getting you all access to TestRail here

@roryabraham I read the chat but is there a way to get a access to the limited testrail cases? to test this issue.

@roryabraham Anyway to get a text dump? so that I can probably just create a checklist and update here with the testing.

Here you go:
Search Page
All Platforms

Click/tap on the magnifying glass icon to open the search page.
Click/tap on the x icon to close the search page.
Click/tap on the magnifying glass to open the search page.
Ensure you can scroll up and down in the results.
Enter a search query – the list should update accordingly.
Click/tap on a result: the search page should close and that chat should open.

Web/Desktop

Press CMD+K to open the search page.
Press Esc to close the search page.
Press CMD+K to reopen the search page.
Type in a search query.
Use the arrow keys to go through the search results. Make sure that the list "wraps", so:

If you are focused on the last result and press ArrowDown you are taken to the first result
If you are focused on the first result and press ArrowUp you are taken to the last result

With the focus somewhere in the middle of the list, update the search input such that there are no results
Press the arrow keys a few times – nothing should happen.
1 Undo the change from the previous step by clearing the search input (press ALT+Delete). The focus should be on the first element of the list, and you should be able to use the arrows to navigate focus (as before)
Enter a new search term. Verify that the first result in the list is highlighted, and that you can navigate up and down from there using the arrow keys.
With a chat highlighted on the search page, press Enter. The search page should close and that chat should open.
Use the mouse to click on the magnifying glass icon and reopen the search page.
Press Esc to close the search page.
Click on the magnifying glass to reopen the search page.
Use the arrow keys and the enter key to select and open a different chat.
Press CMD+K to reopen the search page.
Use the arrows keys to highlight a search result, then press CMD+Enter. The search page should close and your selected chat should open.

New Chat Page
All Platforms

Click/tap on the green + icon on the home screen
Click/tap on New Chat.
Ensure that you can scroll the list of results.
Enter a search query and the results should update accordingly.
click/tap on a search result
The New Chat Page should close and a chat with your selected result should open.

Web/Desktop

Click on the green + icon on the home screen
Click on New Chat
Press ESC – the New Chat Page should close.
Click on the green + icon on the home screen.
Click on New Chat
Use the arrow keys to traverse the list of results. Make sure that the list "wraps", so:

If you are focused on the last result and press ArrowDown you are taken to the first result
If you are focused on the first result and press ArrowUp you are taken to the last result

With the focus somewhere in the middle of the list, update the search input such that there are no results.
Press the arrow keys a few times – nothing should happen.
Undo the change from the previous step – the focus should be back on the first element in the list
With a result highlighted, press Enter and that chat should open.
Reopen the New Chat page and use the arrow keys to highlight a different chat than the one you have open.
Press CMD+Enter and that chat should open.

New Group Page
#####All Platforms

Click/tap on the green + icon on the home screen
Click/tap on New Group.
Ensure that you can scroll the list of results.
Enter a search query and the results should update accordingly.
Click/tap on a result. That result should become checked and move to the top of the results. The list should scroll to the top automatically and you should be able to see your new selection.
Click/tap on another result. That result should become checked and move to the top of the results. The list should scroll to the top automatically and you should be able to see your new selection.
Click/tap on Create Group. The New Group page should close and a chat with all the selected users should open.

Web/Desktop

Click on the green + icon on the home screen.
Click New Group. The New Group Page should open.
Press ESC. The New Group page should close.
Press CMD+SHIFT+K. The New Group Page should open.
Press ESC. The New Group page should close.
Reopen the New Group Page.
If necessary, repeat the following until there are enough elements in the New Group page that the results are scrollable:

Close the New Group page.
Open the New Chat page.
Create a chat with a user that you've not interacted with before.
Reopen the New Group page and check if it's scrollable. If not, go back to the first step.

Use the arrow keys to traverse the list of results. Make sure that the list "wraps". There is a notable difference in expected behavior between this page and the New Chat Page in that the search bar is one of the focusable elements.

If you are focused on the last result and press ArrowDown you are taken to the search bar. None of the elements should be highlighted.
If you are focused on the first result and press ArrowUp you are taken to the search bar. None of the elements should be highlighted.
If you are focused on the search bar and press ArrowUp, you are taken to the last result.
If you are focused on the search bar and press ArrowDown, you are taken to the first result.

With one of the search results highlighted, press Enter. That result should get checked and move to the top of the list. The list should scroll to the top automatically and you should be able to see your new selection.
Use the ArrowDown key to highlight the first unselected result. It should be completely visible.
Use the arrow keys and Enter to select multiple results.
Use the arrow keys to highlight a selected result.
Press Enter to de-select that result.
With a result highlighted, press CMD+Enter, and a group should be opened with your selected results.
Reopen the New Group Page
Without selecting any results, press CMD+Enter. Nothing should happen
Select several results.
Use the arrow keys to go to the search bar (no results highlighted).
Press CMD+Enter, and a group should be opened with your selected results.
Reopen the New Group Page and select several results.
Use the arrow keys to go to the search bar (no results highlighted).
Press Enter (not CMD+Enter), and a group should be opened with your selected results.

IOU Participants (split bill)
All Platforms

Click/tap on the green + icon on the home screen.
Click/tap on Split Bill
Enter an amount.
Ensure that you can scroll the list of results.
Enter a search query and the results should update accordingly.
Make sure you can toggle / untoggle list items.
With some items selected and others not, press Next.
Verify that you the selected items are shown on the next page.

Web/Desktop

Click/tap on the green + icon on the home screen.
Click/tap on Split Bill
Enter an amount and press Next.
Enter a search query to get a reasonable-length list of options.
Use the arrow keys to traverse the list of results. Make sure that the list "wraps":

If you are focused on the last result and press ArrowDown you are taken to the search bar. None of the elements should be highlighted.
If you are focused on the first result and press ArrowUp you are taken to the search bar. None of the elements should be highlighted.
If you are focused on the search bar and press ArrowUp, you are taken to the last result.
If you are focused on the search bar and press ArrowDown, you are taken to the first result.

With one of the search results highlighted, press Enter. That result should get checked and move to the top of the list. The list should scroll to the top automatically and you should be able to see your new selection.
Use the arrow keys and Enter to select multiple results.
Use the arrow keys to highlight a selected result.
Press Enter to de-select that result.
With a result highlighted, press CMD+Enter, and you should move to the next page with your selected results.
Press the back arrow to go to the previous page.
With the search bar focused (no results highlighted), press CMD+Enter, and you should move to the next page with your selected results.
Press the back arrow to go to the previous page.
With the search bar focused (no results highlighted), press Enter (not CMD+Enter), and you should move to the next page with your selected results.

IOU Participants (1:1 request)
All Platforms

Click/tap on the green + icon on the home screen.
Click/tap on Request Money
Enter an amount and press Next
Ensure that you can scroll the list of results.
Enter a search query and the results should update accordingly.
Click/tap on a result, and there should be a new IOU request between you and your selected user.

Web/Desktop

Click/tap on the green + icon on the home screen.
Click/tap on Request Money
Enter an amount and press Next
Enter a search query to get a reasonable-length list of results.
Use the arrow keys to traverse the list of results. Make sure that the list "wraps":

If you are focused on the last result and press ArrowDown you are taken to the first result
If you are focused on the first result and press ArrowUp you are taken to the last result

With a result highlighted, press Enter. That should take you to the next page with your selected user.
Click on the back button.
Use the arrow keys to highlight different result.
Press CMD+Enter. That should take you to the next page with your new selected user.

IOU Confirmation List
All Platforms

Click/tap on the green + icon on the home screen.
Click/tap on Split Bill.
Enter an amount and press Next.
Select some participants and press Next.
Make sure that you can not select or deselect participants.
Hover the mouse over your participants – it should not change into a pointer cursor.
Press Split YOUR_AMOUNT
A new request should be created between you and each of your selected bill split participants.
Open a group chat.
Press the + in the composer and select Split Bill.
Make sure you can select and deselect participants, and that their proportional amount adjusts accordingly.
Hover your mouse over the participants – it should change into a pointer cursor and clicking on participants should select/deselect them.
With some participants selected and others not, press Split YOUR_AMOUNT.
A new request should be created between you and each of your selected bill split participants.

Web/Desktop

Open a group chat.
Click/tap on the + in the composer.
Click/tap on Split Bill.
Enter an amount and press Next.
Use the arrow keys to highlight participants. Make sure that the list "wraps":

If you are focused on the last result and press ArrowDown you are taken to the text input. None of the elements should be highlighted.
If you are focused on the first result and press ArrowUp you are taken to the text input. None of the elements should be highlighted.
If you are focused on the text input and press ArrowUp, you are taken to the last result.
If you are focused on the text input and press ArrowDown, you are taken to the first result.

With a result highlighted, pressing Enter should select and deselect participants, and their proportional amount should adjust accordingly.
Deselect all participants.
Press CMD + Enter. Verify that nothing happens (no IOU should be created with just yourself)
Reselect one or more participants.
With no result highlighted, press Enter. A new request should be created between you and each of your selected participants.
Open a group chat.
Click/tap on the + in the composer.
Click/tap on Split Bill.
Enter an amount and press Next.
With a result highlighted, press CMD+Enter. A new request should be created between you and each of your selected participants.
Open a 1:1 DM with another user (not Chronos or Concierge).
Press the + button in the compose bar and click Request Money
Enter an amount and press Next
Press Enter. The IOU should be created.

Workspace invite page
All Platforms

Create a workspace if you do not already have one.
Navigate to Settings -> Your Workspace -> Manage Members -> Invite.
Verify that you can scroll + search the results on the invite page.
Select several users from the list.
Press Invite, and verify that you are taken to the previous page and the new invitees are shown as members.

Web/Desktop

Create a workspace if you do not already have one.
Navigate to Settings -> Your Workspace -> Manage Members -> Invite.
Use the arrow keys to traverse the list. Verify that the list "wraps":

If you are focused on the last result and press ArrowDown you are taken to the search bar. None of the elements should be highlighted.
If you are focused on the first result and press ArrowUp you are taken to the search bar. None of the elements should be highlighted.
If you are focused on the search bar and press ArrowUp, you are taken to the last result.
If you are focused on the search bar and press ArrowDown, you are taken to the first result.

With an option highlighted, press Enter. That option should be selected and moved to the top of the list. The list should scroll to the top automatically and you should be able to see your new selection.
Select a few more options.
Highlight a selected option and press Enter. That should deselect the option.
With a few options selected, move focus to the search bar (no items highlighted), and press Enter. That should take you to the previous page with the new invitees shown as members.
Press Invite again.
Use the arrow keys to select a few options.
With a search result highlighted, press CMD+Enter. That should take you to the previous page with the new invitees shown as members.
Press Invite again.
Use the arrow keys to select a few options.
With the search bar focused, press CMD+Enter. That should take you to the previous page with the new invitees shown as members.

IOU currency selection
All Platforms

Press the big green + to open the global create menu.
Select "request money"
Tap on the currency symbol ($ in US)
Search for another currency, verify the results list updates.
Select another currency, verify that the currency selection modal closes and the IOU amount page shows the new symbol for the currency you selected.

Web/Desktop

Press the big green + to open the global create menu.
Select "request money"
Click on the currency symbol ($ in US)
Search for another currency, verify the results lists updates.
Use the arrow key to scroll through the list. Verify that it "wraps" such that if you are at the bottom and press ArrowDown, you are taken to the top, and vice-versa.
With an item highlighted, change the search term.
Verify that the list scrolls back to the top and that the first item is highlighted
With an item highlighted, press the enter key.
Verify that the currency selection modal close and the IOU amount page shows the new symbol for the currency you selected.
Click on the currency symbol.
Use the arrow keys to highlight another option.
Press CMD+Enter
Verify that the currency selection modal close and the IOU amount page shows the new symbol for the currency you selected.

Half done, I'll finish by tomorrow. Are we okay with all the code changes? Especially this one

Tested regression suite.

@roryabraham @parasharrajat PR is updated by making the keyboard navigation available by default. Also updated the screencasts and QA steps for the additional components. Please take a look.

I found one issue, which isn't related to my change afaik, when clicking the menu items in the ThreeDotsMenu,  the popover doesn't close. What do you think of putting it outside the scope of this PR?

Thanks for adding screenshots and QA steps! However, I'm not able to reproduce the ThreeDotsMenu issue on staging, so I think we need to address it here

Thanks for adding screenshots and QA steps! However, I'm not able to reproduce the ThreeDotsMenu issue on staging, so I think we need to address it here

In the current PR, it works fine for all the other components, except for ThreeDotsMenu. Let me check once again. Thanks for pointing it out.

It looks like what's happening is:

ThreeDots icon is focused
When you open the PopoverMenu, the focus shifts to that
You use the arrow keys to select an option from the PopoverMenu.
Then you press enter to select the highlighted option from the PopoverMenu
This executes the callback and closes the PopoverMenu, and the focus shifts back to the ThreeDots icon. The same Enter event fires on the ThreeDots menu and it reopens.

Something like that

@roryabraham @parasharrajat Fix added for ThreeDotsMenu. Ready for review.

LGTM and tests well

Not an emergency, see above comment

Echoing @mountiny's sentiment above, thanks so much for your patience and persistence with this issue. I love how we really applied this solution in a generalized way across the app

Lol, this is merged by my testing is still not completed

Do ping me if you find anything and I'll try to quickly raise another PR to address any issue/bug.

🚀 Deployed to staging by @roryabraham in version: 1.1.98-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅


Option do define feature order without workaround

please add the possibility to define hard coded execution oder as last workaround. its not hard to implement and wont break general approach that tests need to be independent 💯 right.
As always there might be an exception in case of an initial password change its mandatory that the update password scenario runs first. As otherwise all the other tests would need to deal with this situation too and thats not practicable.
Please implement the feature options they are interpreted all over the internet even tho it has not any effect at all, to define multiple feature blocks. Still the ugly number_prefix workaround must be used to workaround this special case...
Desired solution:

Actual workaround:

https://forum.katalon.com/t/how-to-run-multiple-feature-files-in-a-specific-sequence-using-cucumber-runner-class/24327

please add the possibility to define hard coded execution oder as last workaround. its not hard to implement and wont break general approach that tests need to be independent 💯 right.

Please submit a pull request if you want to see this added to Cucumber.


htptest: Fixed an issue that could not be compiled.

Could you please explain your problem with more details ?

How are you getting compilation failed ? (how can I reproduce ?)
What is your environment ?


Rust 1.83.0

Address clippy warnings / errors when using Rust 1.83

@mre One additional question - just stumbled upon the test test_exclude_example_domains which is excluded in CI explicitly and it fails consistently. Shouldn't we either fix this test or remove it? I can also create an issue for that.
I see that the test is older than the fixture file. So maybe the test started to fail because the fixture was changed without updating the test?

@mre One additional question - just stumbled upon the test test_exclude_example_domains which is excluded in CI explicitly and it fails consistently. Shouldn't we either fix this test or remove it? I can also create an issue for that.

Yes, we can remove it. If the fixture is easy to be updated, we can also do that, but let's not sweat it. 😉

@trask oh didn't know. Thanks for the info

@thomas-zahner, #1576 got merged, so I guess you can rebase on top of master. 😃

There are no more meaningful changes in this PR, all changes and clippy suggestions were already applied in #1576


Not Pub get Project

Hello
Download your project but when pub get
Getting this Error
The current Dart SDK version is 2.9.2.
Because boilerplate depends on build_runner >=1.10.2 which requires SDK version >=2.10.0-0.0 <3.0.0, version solving failed.
pub get failed (1; Because boilerplate depends on build_runner >=1.10.2 which requires SDK version >=2.10.0-0.0 <3.0.0, version solving failed.)

@BhargavSavasani I encountered the same problem, then I came across some article, and found out that flutter beta version may compatible with this project, https://flutter.dev/docs/development/tools/sdk/upgrading#switching-flutter-channels

i also get this error

overrides analyzer it's  work

please get latest and try again, do let me know if you are still facing the same issue.

please get latest and try again, do let me know if you are still facing the same issue.


DownsampleToViewSize and quality

Hello!
I trying to display 15 photos taken by my camera with a small size (150 width and heigth) (like thumbnail) and without "DownsampleToViewSize" I got this error:

java.lang.OutOfMemoryError: Failed to allocate a 17978124 byte allocation with 9999280 free bytes and 9MB until OOM

So, I put "DownsampleToViewSize" to true but quality is really bad.
I want to know if a possibility exists to downsample my photos without loosing to much quality.
Thanks

I ran into this issue before as well. My workaround was to use Bitmap.Compress() method to compress the Android image to reduce its size to my preference.

Fixed with HeigthRequest/WidthRequest at 130 and DownsampleHeight/DownsampleWidth at 300


.replace no longer relies on Polymer internals

[x] CHANGELOG.md has been updated

The .replace function no longer relies on Polymer internals. Instead of stubbing Polymer.Base.instanceTemplate or Polymer.Element.prototype._stampElement, it just stubs document.importNode (with the blessing of Kevin). Tested on both Polymer 1.x and 2.x.
NOTE: The tests for it do rely on Polymer internals because they go through usual Polymer use cases, but the tests are compatible with both Polymer 2.x and 1.x. LMK if this is a problem; can change to webcomponent lifetime tests if preferred.

Looks good. Are there any docs that need to be updated? Either in this repo or on the site?

API is the same. I have noted the stubbing of document.importNode in the changelog; I can't think of anything else to document.


Adds Storybook breadcrumb component

Adds a Breadcrumb component. I haven't added any controls to this one, because I'm not sure that would help us all that much, but I could if that were desirable.
Fixes #14

I think that's a good practice, but note that in this example the last breadcrumb (i.e. the current page) is NOT linked, so I'm not sure it's relevant given how we've implemented this here?


osdslet daemon failed to start

The etcd for the K8S local cluster is using port 2379.  As a result, osdslet daemon failed to start but there was no clear indication what was the problem.  If the port is in-use, we should print out a clear error message.  Also since K8S is using 2379, we should change our default value to avoid collisions.
etcd_release: v3.2.0
etcd_host: <IP_ADDRESS>
etcd_port: 2379
etcd_peer_port: 2380

Currently we would detect if etcd daemon is runninig using ps check rather port check before etcd installation, so it would fail when changing the etcd port from 2379

Hi @BaiHuoYu , can you take a look at this issue? We should change the detection command, or else it would fail if we change the etcd port.

Already fixed


After server list is cycled through without having any valid certificates, disconnect

I got disconnected from one network which doesn't have valid certificate at 3:47:23+0200 and now it's 07:33+0200 and I am at computer and can accept the certificate.
This network has 4 servers specified and scrollback looks like ZNC has been cycling between these 4 servers for hours.

---
Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/6871067-after-server-list-is-cycled-through-without-having-any-valid-certificates-disconnect?utm_campaign=plugin&utm_content=tracker%2F1759&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F1759&utm_medium=issues&utm_source=github).

I think better solution for this which would work for everyone would be fixing https://github.com/znc/znc/issues/67.


Audit and make documentation for command JSON.STRLEN consistent

The documentation of the command [JSON.STRLEN](https://dicedb.io/commands/jsonstrlen/) present in the docs could have become stale. We need your help to ensure that the documentation is complete, correct, and consistent.  Completing this issue will give you much-needed exposure to how the command is implemented and the different parameters it accepts. Hence, this is a great way to build a good understanding of the project and its functionality. While still making a significant contribution. Here's what you need to do:

Go through the documentation of the command and run all the examples, making sure they all work as expected
If the same command is present in Redis, then the expected output of the DiceDB command is the same as the Redis output
If the command is not in Redis, then as per your judgment, raise an issue with this template or fix the documentation and raise a pull request.
The documentation should contain the following sections in the following order

short and concise introduction paragraph about the command covering what it does
Syntax
Parameters: List all the parameters the command accepts, and ignore the section if there are no parameters
Return values: List all possible return values and under what condition
Behaviour: Describe the behavior of the command, what it does, how it does it, some internal specifics if any
Errors: List all possible errors the command can throw and under what condition
Examples: List all possible examples of the command and the expected output. Assume CLI implementation

Note: The title of the sections should be the exact strings mentioned above, like "Examples", "Return values", etc.
Note: The description of the command in Frontmatter of the command.md file is the first paragraph (introduction) of the command.
Go through the DiceDB/dice repository and explore the command implementation

to understand all possible return values
to understand all possible error values and conditions
to understand different parameters the command accepts

Please use the documentation of the SET command as the reference point and structure the
documentation of this command in a very similar way, including the following points

if you see any "Conclusion" section, remove it
the headers (h1, h2, h3) should be appropriately used
the CLI prompt should be <IP_ADDRESS>:7379> and not anything else
Use markdown tables for parameters and return values (ref SET command documentation)
wrap any command or paramter in backticks (`) to highlight them
the section header should be capitalize as used in the SET command documentation

If you find any inconsistencies, please fix the documentation and raise the PR.
The core idea of this exercise is to ensure that the documentation is consistent, correct, and complete.
Make sure you comment on the other issues you created (if any) as a comment on this issue and also any PR (if any) that you created.
Thank you for picking this up and contributing to the DiceDB. It means a ton.

I would like to work on this.

when i am trying to get the string length of an element in an array using $.[0] then i am getting an error(" ERROR invalid JSONPath") whereas Redis is giving the size of the element if its's a string.
eg:  JSON.SET user:1 $ '["admin", "user"]' --> In this case JSON.STRLEN user:1 $.[0] returns 5 in redis and "ERROR invalid JSONPath" in dice


Activedataprovider set limit inside of query with union but should outside

What steps will reproduce the problem?
$query = Product::find()->where(['id' => 1]);
$query2 = Product::find()->where(['id' => 2]);
$query-> union($query2);
$provider = new ActiveDataProvider([
'query' => $query,
    'pagination' => [
        'pageSize' => 12,
    ],
]);
$provider->getModels();

What is the expected result?
(SELECT * FROM product WHERE id=1) UNION ( SELECT * FROM product WHERE id=2 ) LIMIT 12
What do you get instead?
(SELECT * FROM product WHERE id=1 LIMIT 12) UNION ( SELECT * FROM product WHERE id=2 )
Additional info

Q
A

Yii version
2.0.?

PHP version

Operating system

It's a specific use case.
We can solve it somehow like this (inside of ActiveDataProvider):
// concept, did not test it
function wrapQuery(query)
{
    $newQuery = new get_class($query);
    $query->from($query)

    return $newQuery; // and then execute this $newQuery
}

I'm not sure whether we should add this complexity to ActiveDataProvider.
@tunforjob you can try to use my concept in your application code before passing $query to ActiveDataProvider

Relates #7992

It's a specific use case.

Not if you look at the topic @klimov-paul supplied. We should develop a solution that matches the expected result of the issue introduction.

Would it make sense to:

Remove ->union() from Query.
Introduce: UnionQuery::__construct($q1, $q2)?

That way create a more explicit and intuitive syntax.

Yes. That's a good idea.

agree, thats intuitive

any progress on this?

This issue is scheduled on future milestone. In you would like to help use with this issue - submit a pull request, we will highly appreciate it.

SilverFire's solution work fine.
protected function wrapQuery($query)
{
$newQuery = new ActiveQuery($query->modelClass);
$newQuery->from(['originalQuery' => $query]);
    return $newQuery; // and then use this $newQuery for pagination
}

I vote for fixes by SamMousa
to introduce UnionQuery::__construct($q1, $q2) or somelike this
But need think about API for this class:

alias for union table
and what this class should return ActiveQuery, Query...
how uses filters after union

 $query->andFilterWhere(//... );

For now, my code look this  for this case
https://github.com/githubjeka/tracker-issues/blob/6a53251e1892f50212608162b0258ebba5b08e1f/models/DocumentSearch.php#L51

@githubjeka those issues sound like they are solvable.
ActiveQueryInterface mainly adds with, via and findFor, all of these are not needed for the union.
To make sure a union query can still return ActiveRecord objects we could even do something really cool (just thought of it, might have some drawbacks):

A union query consists of n query objects.
Assign a unique identifier to each query object.
Add a constant to the select clause of each query.
Execute the query.
For each result row, remove the identifier from (2) and then call populate($rows) on the correct query object.

So suppose I have 2 ActiveQuery objects one for model Car and one for model Bike, each of these have the select clause set to ['id', 'name']. The invidual queries look like this:
SELECT id, name FROM car;
SELECT Id,name FROM bike;

The union query would do this:
SELECT "0" as queryObj, id, name FROM car
UNION
SELECT "1" as queryObj, id, name FROM bike;

Then after retrieving the results it would pass each row to populate and get the resulting object.
One downside to this approach is that it will create duplicates in the query results which are normally filtered by ActiveQuery.
Of course this approach could be simplified, in case both ActiveQuery instances are of the same class and have the same modelClass.
What we need to do is figure out some usages and expected results, for example:
// Expected result get all cars as AR models.
(new UnionQuery(Car::find(), Car::find()))->all();

// Expected result get cars with id < 10 or > 20 as AR models.
(new UnionQuery(Car::find()->where(['<', 'id', 10]), Car::find()->where(['>', 'id', 20])))->all();

// Expected result get all cars as arrays, followed by all cars as AR models. ?
(new UnionQuery(Car::find()->asArray(), Car::find()))->all();

// Expected result get all cars with id < 10 and all cars with (id > 20 and with the Owner relation populated)
(new UnionQuery(Car::find()->where(['<', 'id', 10]), Car::find()->with('Owner')->where(['>', 'id', 20])))->all();

Some of these uses, for example the last one, will be hard to properly implement in ALL cases; however this does not seem like a proper use to me that needs in depth support.
In most cases where you use a UNION you have to very similar queries with results of the same type and in the same format.

When I change the place of union in code of QueryBuilder.php
from
`$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset);
    if (!empty($query->orderBy)) {
        foreach ($query->orderBy as $expression) {
            if ($expression instanceof Expression) {
                $params = array_merge($params, $expression->params);
            }
        }
    }
    if (!empty($query->groupBy)) {
        foreach ($query->groupBy as $expression) {
            if ($expression instanceof Expression) {
                $params = array_merge($params, $expression->params);
            }
        }
    }

    $union = $this->buildUnion($query->union, $params);
    if ($union !== '') {
        $sql = "($sql){$this->separator}$union";
    }`

to
`$union = $this->buildUnion($query->union, $params);
    if ($union !== '') {
        $sql = "($sql){$this->separator}$union";
    }

    $sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset);
    if (!empty($query->orderBy)) {
        foreach ($query->orderBy as $expression) {
            if ($expression instanceof Expression) {
                $params = array_merge($params, $expression->params);
            }
        }
    }
    if (!empty($query->groupBy)) {
        foreach ($query->groupBy as $expression) {
            if ($expression instanceof Expression) {
                $params = array_merge($params, $expression->params);
            }
        }
    }`

it works the union with sorting, limit, paging and it products a ActiveRecord and not array.
Hope it helps what I found.

problev actualy!!!
thanks for patch @m2fik